From 1009ef284f3932c41cff1158818c87821fe511fa Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 18 Aug 2014 18:14:56 +0930 Subject: [PATCH] PowerPC fix for ifunc broken by d1eca1e4 This probably could be fixed by making changes in relocate_section for ifunc, but it's simpler to disable the optimisation for ifunc. * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Don't attempt to use dynrelocs for ifunc. * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Similarly. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-ppc.c | 5 ++++- bfd/elf64-ppc.c | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3c2ed575c8..d7265d4777 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-08-18 Alan Modra + + * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Don't attempt to + use dynrelocs for ifunc. + * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Similarly. + 2014-08-18 Alan Modra PR 17287 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index e20e804ce7..97f4724330 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5512,9 +5512,12 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, { /* Taking a function's address in a read/write section doesn't require us to define the function symbol in the - executable on a global entry stub. A dynamic reloc can + executable on a plt call stub. A dynamic reloc can be used instead. */ if (h->pointer_equality_needed + && h->type != STT_GNU_IFUNC + && !htab->is_vxworks + && !ppc_elf_hash_entry (h)->has_sda_refs && !readonly_dynrelocs (h)) { h->pointer_equality_needed = 0; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 0efc6025aa..ca2dd4cb76 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -7002,6 +7002,7 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, executable on a global entry stub. A dynamic reloc can be used instead. */ if (h->pointer_equality_needed + && h->type != STT_GNU_IFUNC && !readonly_dynrelocs (h)) { h->pointer_equality_needed = 0;