From: H.J. Lu Date: Sat, 14 Oct 2017 17:23:48 +0000 (-0700) Subject: aarch64: Check UNDEFWEAK_NO_DYNAMIC_RELOC X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ddb7fd0f7b43e4c755c4b8c7752948e050363525;p=binutils-gdb.git aarch64: Check UNDEFWEAK_NO_DYNAMIC_RELOC Don't generate dynamic relocation against weak undefined symbol if it is resolved to zero. FIXME: UNDEFWEAK_NO_DYNAMIC_RELOC may need to be checked in more places. PR ld/22269 * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Don't generate dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true. (elfNN_aarch64_allocate_dynrelocs): Discard dynamic relocations if UNDEFWEAK_NO_DYNAMIC_RELOC is true. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 59bfdf05d67..70b153bfcc8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-10-14 H.J. Lu + + PR ld/22269 + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Don't + generate dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is + true. + (elfNN_aarch64_allocate_dynrelocs): Discard dynamic relocations + if UNDEFWEAK_NO_DYNAMIC_RELOC is true. + 2017-10-14 H.J. Lu * elf32-ppc.c (UNDEFWEAK_NO_DYNAMIC_RELOC): Moved to ... diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 5fd314dee2a..3083f3b0ad1 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -4953,6 +4953,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, bfd_boolean relative_reloc; asection *base_got; bfd_vma orig_value = value; + bfd_boolean resolved_to_zero; globals = elf_aarch64_hash_table (info); @@ -5178,6 +5179,9 @@ bad_ifunc_reloc: } } + resolved_to_zero = (h != NULL + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); + switch (bfd_r_type) { case BFD_RELOC_AARCH64_NONE: @@ -5196,7 +5200,8 @@ bad_ifunc_reloc: || globals->root.is_relocatable_executable) && (input_section->flags & SEC_ALLOC) && (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !resolved_to_zero) || h->root.type != bfd_link_hash_undefweak)) /* Or we are creating an executable, we may need to keep relocations for symbols satisfied by a dynamic library if we manage to avoid @@ -8287,7 +8292,8 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) visibility. */ if (eh->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak) { - if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) eh->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic