summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-08-18 18:14:56 +0930
committerAlan Modra <amodra@gmail.com>2014-08-18 21:00:46 +0930
commit1009ef284f3932c41cff1158818c87821fe511fa (patch)
treeb1f2efcc6332ddf96cdc4aa3a6c82ffe2ebfdd7f
parent1240be6b7d0a5604c4e3efe12c9e1d08ebc246be (diff)
downloadbinutils-1009ef284f3932c41cff1158818c87821fe511fa.tar.gz
binutils-1009ef284f3932c41cff1158818c87821fe511fa.tar.bz2
binutils-1009ef284f3932c41cff1158818c87821fe511fa.zip
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.
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elf32-ppc.c5
-rw-r--r--bfd/elf64-ppc.c1
3 files changed, 11 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3c2ed575c85..d7265d4777b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
2014-08-18 Alan Modra <amodra@gmail.com>
+ * 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 <amodra@gmail.com>
+
PR 17287
* elflink.c (on_needed_list): Only consider libraries that have
been loaded.
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index e20e804ce7e..97f47243302 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 0efc6025aab..ca2dd4cb764 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;