aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Anglin <dave.anglin@nrc.ca>2011-11-06 20:25:17 +0000
committerDave Anglin <dave.anglin@nrc.ca>2011-11-06 20:25:17 +0000
commit4340287bb599d565731c8c227247e2612679b2eb (patch)
tree5374c45b20ccbc52974680863cd85e3c3104e55f
parent6f809020fa8347a1a204a5d2b53d3b4654ec8e80 (diff)
downloadbinutils-4340287bb599d565731c8c227247e2612679b2eb.zip
binutils-4340287bb599d565731c8c227247e2612679b2eb.tar.gz
binutils-4340287bb599d565731c8c227247e2612679b2eb.tar.bz2
PR ld/13387
* elf32-hppa.c (elf32_hppa_hide_symbol): Make STT_GNU_IFUNC symbol go through PLT. Reset plt field with init_plt_offset. (elf32_hppa_adjust_dynamic_symbol): Ensure that a PLT slot is allocated for symbols referenced by a plabel.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-hppa.c13
2 files changed, 19 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ebf5b0f..ac69b7b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2011-11-06 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ PR ld/13387
+ * elf32-hppa.c (elf32_hppa_hide_symbol): Make STT_GNU_IFUNC symbol
+ go through PLT. Reset plt field with init_plt_offset.
+ (elf32_hppa_adjust_dynamic_symbol): Ensure that a PLT slot is
+ allocated for symbols referenced by a plabel.
+
2011-11-02 DJ Delorie <dj@redhat.com>
* elf32-rl78.c (rl78_elf_merge_private_bfd_data): Delete unused
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 7f0f2cb..fcf51cf 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -1789,10 +1789,12 @@ elf32_hppa_hide_symbol (struct bfd_link_info *info,
}
}
- if (! hppa_elf_hash_entry (eh)->plabel)
+ /* STT_GNU_IFUNC symbol must go through PLT. */
+ if (! hppa_elf_hash_entry (eh)->plabel
+ && eh->type != STT_GNU_IFUNC)
{
eh->needs_plt = 0;
- eh->plt = elf_hash_table (info)->init_plt_refcount;
+ eh->plt = elf_hash_table (info)->init_plt_offset;
}
}
@@ -1814,6 +1816,13 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
if (eh->type == STT_FUNC
|| eh->needs_plt)
{
+ /* If the symbol is used by a plabel, we must allocate a PLT slot.
+ The refcounts are not reliable when it has been hidden since
+ hide_symbol can be called before the plabel flag is set. */
+ if (hppa_elf_hash_entry (eh)->plabel
+ && eh->plt.refcount <= 0)
+ eh->plt.refcount = 1;
+
if (eh->plt.refcount <= 0
|| (eh->def_regular
&& eh->root.type != bfd_link_hash_defweak