diff options
author | Cupertino Miranda <cmiranda@synopsys.com> | 2016-05-26 16:00:08 +0200 |
---|---|---|
committer | Claudiu Zissulescu <claziss@synopsys.com> | 2016-06-13 16:10:00 +0200 |
commit | 3b63d2cee1e6b894981cab59183480ac0972146a (patch) | |
tree | cd07920b8f23e6d73a42208a8704e55e16f94f7e | |
parent | 2ab2f40d58e6ad530667b018e42dd71519556f1b (diff) | |
download | gdb-3b63d2cee1e6b894981cab59183480ac0972146a.zip gdb-3b63d2cee1e6b894981cab59183480ac0972146a.tar.gz gdb-3b63d2cee1e6b894981cab59183480ac0972146a.tar.bz2 |
[ARC] Fixes related to reordering of .got and .got.plt
- Correctly solved relocations on the .got header.
- This bug arrised from enabling RELRO (-z combreloc).
Because the .got and .got.plt sections were split in new linker
scripts the header is no longer part of sgotplt contents.
Changed the patch to sgot contents instead.
- Latest fix to .got header relocs.
bfd/
2016-06-13 Cupertino Miranda <cmiranda@synospsy.com>
* elf32-arc.c (elf_arc_finish_dynamic_sections): Changed.
-rw-r--r-- | bfd/ChangeLog | 4 | ||||
-rw-r--r-- | bfd/elf32-arc.c | 17 |
2 files changed, 16 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1bec3a0..6dccb38 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,9 @@ 2016-06-13 Cupertino Miranda <cmiranda@synospsy.com> + * elf32-arc.c (elf_arc_finish_dynamic_sections): Changed. + +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 diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index bb9cb29..7493a1e 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -2546,17 +2546,24 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd, /* Fill in the first three entries in the global offset table. */ if (htab->sgot) { - if (htab->sgot->size > 0 || htab->sgotplt->size > 0) + struct elf_link_hash_entry *h; + h = elf_link_hash_lookup (elf_hash_table (info), "_GLOBAL_OFFSET_TABLE_", + FALSE, FALSE, TRUE); + + if (h != NULL && h->root.type != bfd_link_hash_undefined + && h->root.u.def.section != NULL) { + asection *sec = h->root.u.def.section; + if (ds.sdyn == NULL) bfd_put_32 (output_bfd, (bfd_vma) 0, - htab->sgotplt->contents); + sec->contents); else bfd_put_32 (output_bfd, ds.sdyn->output_section->vma + ds.sdyn->output_offset, - htab->sgotplt->contents); - bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 4); - bfd_put_32 (output_bfd, (bfd_vma) 0, htab->sgotplt->contents + 8); + sec->contents); + bfd_put_32 (output_bfd, (bfd_vma) 0, sec->contents + 4); + bfd_put_32 (output_bfd, (bfd_vma) 0, sec->contents + 8); } } |