From 0fc9967d0b28a1e037233d49cec479d3ab1e9e59 Mon Sep 17 00:00:00 2001 From: "Jose E. Marchesi" Date: Sat, 19 Nov 2016 04:39:09 -0800 Subject: [PATCH] Revert "bfd: allow negative offsets to _GLOBAL_OFFSET_TABLE_ in elf64 SPARC" 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 | 5 +++++ bfd/elfxx-sparc.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8a18a6d21b6..f28351db1f0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-11-19 Jose E. Marchesi + + * 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 * elfxx-sparc.c (_bfd_sparc_elf_relocate_section): Don't convert diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index e1c7b22efbb..cf3001291e0 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; -- 2.30.2