Revert "bfd: allow negative offsets to _GLOBAL_OFFSET_TABLE_ in elf64 SPARC"
authorJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 19 Nov 2016 12:39:09 +0000 (04:39 -0800)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 19 Nov 2016 12:39:09 +0000 (04:39 -0800)
This reverts commit b19753ce31da347605dfa903c6fd2158e2444f0d.

As it turns out, GCC (and the assembler) needs additional work in
order to support negative GOT offsets in 64-bit sparc.  This is
breaking TLS Local Dynamic in position-independent code.

bfd/ChangeLog
bfd/elfxx-sparc.c

index 8a18a6d21b63ed931e7ebeac77b5260839fadcfe..f28351db1f0909b1d2074a637a863d18e4585add 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-19  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+       * elfxx-sparc.c (_bfd_sparc_elf_size_dynamic_sections): Do not
+       apply the negative GOT offset optimization in 64-bit code.
+
 2016-11-18  James Clarke  <jrtc27@jrtc27.com>
 
        * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert
index e1c7b22efbb465d10094813cd26c36a7284f6597..cf3001291e0702fd294ffb4fd303bf991640cb71 100644 (file)
@@ -2661,19 +2661,19 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
   /* Allocate .plt and .got entries, and space for local symbols.  */
   htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
 
-  if (!htab->is_vxworks
+  if (! ABI_64_P (output_bfd)
+      && !htab->is_vxworks
       && elf_hash_table (info)->dynamic_sections_created)
     {
-      if (! ABI_64_P (output_bfd))
-        {
-          /* Make space for the trailing nop in .plt.  */
-          if (htab->elf.splt->size > 0)
-            htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
-        }
+      /* Make space for the trailing nop in .plt.  */
+      if (htab->elf.splt->size > 0)
+       htab->elf.splt->size += 1 * SPARC_INSN_BYTES;
 
       /* If the .got section is more than 0x1000 bytes, we add
         0x1000 to the value of _GLOBAL_OFFSET_TABLE_, so that 13
-        bit relocations have a greater chance of working.  */
+        bit relocations have a greater chance of working.
+
+        FIXME: Make this optimization work for 64-bit too.  */
       if (htab->elf.sgot->size >= 0x1000
          && elf_hash_table (info)->hgot->root.u.def.value == 0)
        elf_hash_table (info)->hgot->root.u.def.value = 0x1000;