[COMMITTED][SPARC] Revert "bfd: allow negative offsets to _GLOBAL_OFFSET_TABLE_ in elf64 SPARC"

Jose E. Marchesi jose.marchesi@oracle.com
Sat Nov 19 12:57:00 GMT 2016


As it turns out, both GCC and the assembler need additional work in
order to support negative GOT offsets in 64-bit sparc: TLS Local Dynamic
sequences are not prepared to support negative GOT offsets in PIC code.

This is biting the Debian folk badly, so I just reverted the commit that
activated the optimization in 64-bit:
b19753ce31da347605dfa903c6fd2158e2444f0d.

Tested in sparc64-linux-gnu.

bfd/ChangeLog:

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.
 
diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
index e1c7b22..cf30012 100644
--- a/bfd/elfxx-sparc.c
+++ b/bfd/elfxx-sparc.c
@@ -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;



More information about the Binutils mailing list