From 2ab2f40d58e6ad530667b018e42dd71519556f1b Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Fri, 20 May 2016 12:06:17 +0200 Subject: [PATCH] [ARC] General bug fixes Fail safe for trying to reloc GOT and PLT on non dynamic linker. Fix issue with dynamic relocs not being generated with -pie. Removed some structures that were not being used. Fixed typo changing RELENT to RELAENT. Fix for all SECTOFF relocations. bfd/ 2016-06-13 Cupertino Miranda * elf32-arc.c (arc_local_data, arc_local_data): Removed. (SECTSTART): Changed. (elf_arc_relocate_section): Fixed mistake in PIE related condition. (elf_arc_size_dynamic_sections): Changed DT_RELENT to DT_RELAENT. --- bfd/ChangeLog | 8 ++++++++ bfd/elf32-arc.c | 36 +++++++++++++++++------------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9eb30ef9590..1bec3a0bfea 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2016-06-13 Cupertino Miranda + + * elf32-arc.c (arc_local_data, arc_local_data): Removed. + (SECTSTART): Changed. + (elf_arc_relocate_section): Fixed mistake in PIE related + condition. + (elf_arc_size_dynamic_sections): Changed DT_RELENT to DT_RELAENT. + 2016-06-13 Cupertino Miranda * elf32-arc.c (elf32_arc_reloc_type_class): Defined function to diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 82b76872c06..bb9cb29dbc7 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -70,20 +70,6 @@ name_for_global_symbol (struct elf_link_hash_entry *h) bfd_elf32_swap_reloca_out (BFD, &_rel, _loc); \ } -struct arc_local_data -{ - bfd_vma sdata_begin_symbol_vma; - asection * sdata_output_section; - bfd_vma got_symbol_vma; -}; - -struct arc_local_data global_arc_data = -{ - .sdata_begin_symbol_vma = 0, - .sdata_output_section = NULL, - .got_symbol_vma = 0, -}; - struct dynamic_sections { bfd_boolean initialized; @@ -874,7 +860,9 @@ arc_special_overflow_checks (const struct arc_relocation_data reloc_data, (reloc_data.input_section->output_section->vma \ + reloc_data.input_section->output_offset \ + (reloc_data.reloc_offset)))) -#define SECTSTART (bfd_signed_vma) (reloc_data.input_section->output_offset) +#define SECTSTART (bfd_signed_vma) (reloc_data.sym_section->output_section->vma \ + + reloc_data.sym_section->output_offset) + #define _SDA_BASE_ (bfd_signed_vma) (reloc_data.sdata_begin_symbol_vma) #define TLS_REL (bfd_signed_vma) \ ((elf_hash_table (info))->tls_sec->output_section->vma) @@ -1588,7 +1576,7 @@ elf_arc_relocate_section (bfd * output_bfd, case R_ARC_32_ME: case R_ARC_PC32: case R_ARC_32_PCREL: - if (bfd_link_pic (info) && !bfd_link_pie (info) + if ((bfd_link_pic (info) || bfd_link_pie (info)) && ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL) || (h != NULL && h->dynindx != -1 @@ -1683,6 +1671,16 @@ elf_arc_relocate_section (bfd * output_bfd, DEBUG_ARC_RELOC (reloc_data); + /* Make sure we have with a dynamic linker. In case of GOT and PLT + the sym_section should point to .got or .plt respectively. */ + if (is_reloc_for_GOT (howto) || is_reloc_for_PLT (howto)) + { + (*_bfd_error_handler) + (_("GOT and PLT relocations cannot be fixed with a non dynamic linker.")); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + if (arc_do_relocation (contents, reloc_data, info) != bfd_reloc_ok) return FALSE; } @@ -1825,7 +1823,7 @@ elf_arc_check_relocs (bfd * abfd, and the dynamic linker can not resolve these. However the error should not occur for e.g. debugging or non-readonly sections. */ - if (bfd_link_dll (info) && !bfd_link_pie (info) + if ((bfd_link_dll (info) && !bfd_link_pie (info)) && (sec->flags & SEC_ALLOC) != 0 && (sec->flags & SEC_READONLY) != 0 && ((sec->flags & SEC_CODE) != 0 @@ -1856,7 +1854,7 @@ elf_arc_check_relocs (bfd * abfd, /* FALLTHROUGH */ case R_ARC_PC32: case R_ARC_32_PCREL: - if (bfd_link_pic (info) && !bfd_link_pie (info) + if ((bfd_link_pic (info) || bfd_link_pie (info)) && ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL) || (h != NULL && h->dynindx != -1 @@ -2686,7 +2684,7 @@ elf_arc_size_dynamic_sections (bfd * output_bfd, if (relocs_exist == TRUE) if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0) || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_RELENT, + || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT, sizeof (Elf32_External_Rela)) ) return FALSE; -- 2.30.2