aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-arc.c
diff options
context:
space:
mode:
authorCupertino Miranda <cmiranda@synopsys.com>2016-05-20 12:06:17 +0200
committerClaudiu Zissulescu <claziss@synopsys.com>2016-06-13 16:07:02 +0200
commit2ab2f40d58e6ad530667b018e42dd71519556f1b (patch)
tree8f0edbc9ba93907e4d98c3c9bd95b34b387a270b /bfd/elf32-arc.c
parent0f7f3789ca97ecaf0c4169c6d82e205f69fa0580 (diff)
downloadgdb-2ab2f40d58e6ad530667b018e42dd71519556f1b.zip
gdb-2ab2f40d58e6ad530667b018e42dd71519556f1b.tar.gz
gdb-2ab2f40d58e6ad530667b018e42dd71519556f1b.tar.bz2
[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 <cmiranda@synospsy.com> * 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.
Diffstat (limited to 'bfd/elf32-arc.c')
-rw-r--r--bfd/elf32-arc.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 82b7687..bb9cb29 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;