From: Alan Modra Date: Fri, 27 Apr 2018 06:16:40 +0000 (+0930) Subject: PR23123, PowerPC32 ifunc regression X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=69bc498952e7e477d6f96f3b6f900a6112e82350;p=thirdparty%2Fbinutils-gdb.git PR23123, PowerPC32 ifunc regression Two of the gcc ifunc tests fail for ppc32, due to my pr22374 fix being a little too enthusiastic in trimming PLT entries. ppc64 doesn't have the same failures because ppc64_elf_check_relocs happens to set needs_plt for any ifunc reloc. PR 23123 PR 22374 * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Don't drop plt relocs for ifuncs. * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Comment fixes. (cherry picked from commit 04383fd15b3b82d824df9c72e3ade88c43bfb5ac) --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ad41bbf8608..c54a5c0549b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2018-04-27 Alan Modra + + PR 23123 + PR 22374 + * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Don't drop plt + relocs for ifuncs. + * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Comment fixes. + 2018-02-09 H.J. Lu * elf32-i386.c (elf_i386_get_synthetic_symtab): Also handle diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 092b1ced8dd..16ee60fb0ee 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5551,9 +5551,9 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, && !readonly_dynrelocs (h)) { h->pointer_equality_needed = 0; - /* If we haven't seen a branch reloc then we don't need - a plt entry. */ - if (!h->needs_plt) + /* If we haven't seen a branch reloc and the symbol + isn't an ifunc then we don't need a plt entry. */ + if (!h->needs_plt && h->type != STT_GNU_IFUNC) h->plt.plist = NULL; } else if (!bfd_link_pic (info)) diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 039294fd1cd..8940d0aa560 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -7183,8 +7183,8 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (!readonly_dynrelocs (h)) { h->pointer_equality_needed = 0; - /* If we haven't seen a branch reloc then we don't need - a plt entry. */ + /* If we haven't seen a branch reloc and the symbol + isn't an ifunc then we don't need a plt entry. */ if (!h->needs_plt) h->plt.plist = NULL; } @@ -7200,8 +7200,8 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, else if (!h->needs_plt && !readonly_dynrelocs (h)) { - /* If we haven't seen a branch reloc then we don't need a - plt entry. */ + /* If we haven't seen a branch reloc and the symbol isn't an + ifunc then we don't need a plt entry. */ h->plt.plist = NULL; h->pointer_equality_needed = 0; return TRUE;