[ARC] Fixes related to reordering of .got and .got.plt
authorCupertino Miranda <cmiranda@synopsys.com>
Thu, 26 May 2016 14:00:08 +0000 (16:00 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Mon, 13 Jun 2016 14:10:00 +0000 (16:10 +0200)
- 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.

bfd/ChangeLog
bfd/elf32-arc.c

index 1bec3a0..6dccb38 100644 (file)
@@ -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
index bb9cb29..7493a1e 100644 (file)
@@ -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);
        }
     }