diff options
author | Dave Anglin <dave.anglin@nrc.ca> | 2011-11-06 20:25:17 +0000 |
---|---|---|
committer | Dave Anglin <dave.anglin@nrc.ca> | 2011-11-06 20:25:17 +0000 |
commit | 4340287bb599d565731c8c227247e2612679b2eb (patch) | |
tree | 5374c45b20ccbc52974680863cd85e3c3104e55f | |
parent | 6f809020fa8347a1a204a5d2b53d3b4654ec8e80 (diff) | |
download | binutils-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/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 13 |
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 |