diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2017-11-15 15:56:30 +0000 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2017-11-27 11:49:53 +0000 |
commit | a377ae2ad683d3c16ae74dba440ee441120a7d8a (patch) | |
tree | 3f231ad7b2614996231a895bcc1a1df3612fdd14 | |
parent | 64973b0ac4c34e80821a56561ae1af15f7d6e809 (diff) | |
download | gdb-a377ae2ad683d3c16ae74dba440ee441120a7d8a.zip gdb-a377ae2ad683d3c16ae74dba440ee441120a7d8a.tar.gz gdb-a377ae2ad683d3c16ae74dba440ee441120a7d8a.tar.bz2 |
[PR ld/22269] aarch64: Handle local undefined weak symbols
With static pie linking undefined weak symbols are forced to resolve locally
to 0, so no GOT setup is needed in elfNN_aarch64_finish_dynamic_symbol,
which previously failed for these symbols.
The failure caused the unhelpful error message:
"ld: final link failed: Nonrepresentable section on output"
bfd/
PR ld/22269
* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Use
UNDEFWEAK_NO_DYNAMIC_RELOC to avoid dynamic GOT relocs.
(elfNN_aarch64_allocate_dynrelocs): Likewise.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elfnn-aarch64.c | 10 |
2 files changed, 15 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0395dcf..46c2a59 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2017-11-27 Szabolcs Nagy <szabolcs.nagy@arm.com> + + PR ld/22269 + * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): Use + UNDEFWEAK_NO_DYNAMIC_RELOC to avoid dynamic GOT relocs. + (elfNN_aarch64_allocate_dynrelocs): Likewise. + 2017-11-24 H.J. Lu <hongjiu.lu@intel.com> PR binutils/22444 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 4521884..7571a16 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -8022,7 +8022,10 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak) && (bfd_link_pic (info) - || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) + || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)) + /* Undefined weak symbol in static PIE resolves to 0 without + any dynamic relocations. */ + && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) { htab->root.srelgot->size += RELOC_SIZE (htab); } @@ -8824,7 +8827,10 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, } if (h->got.offset != (bfd_vma) - 1 - && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL) + && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL + /* Undefined weak symbol in static PIE resolves to 0 without + any dynamic relocations. */ + && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) { Elf_Internal_Rela rela; bfd_byte *loc; |