diff options
author | Alan Modra <amodra@gmail.com> | 2018-04-27 15:46:40 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-04-27 17:12:32 +0930 |
commit | 04383fd15b3b82d824df9c72e3ade88c43bfb5ac (patch) | |
tree | e61f7ca05cb6fb083adf17f802176c5b234ab8c5 /bfd | |
parent | ced8ce28a4f72cfd8eaee0d17cf090997cc2fab7 (diff) | |
download | gdb-04383fd15b3b82d824df9c72e3ade88c43bfb5ac.zip gdb-04383fd15b3b82d824df9c72e3ade88c43bfb5ac.tar.gz gdb-04383fd15b3b82d824df9c72e3ade88c43bfb5ac.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 6 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 8 |
3 files changed, 15 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fcfd913..5494875 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2018-04-27 Alan Modra <amodra@gmail.com> + + 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-04-26 Pedro Alves <palves@redhat.com> * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't consider diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 0438af4..1200de8 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5899,9 +5899,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 9009768..09377d1 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -7304,8 +7304,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; } @@ -7321,8 +7321,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; |