aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfxx-x86.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-12 02:12:47 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-12 02:14:34 -0700
commit9f8575350f980aa6da8c488c6aa30862620eaa1f (patch)
treeb0bc03bd7456aad7444e20a511405cf3ab4ccce4 /bfd/elfxx-x86.c
parent359987e21867b730564ff46ddceaafdc93d0fb49 (diff)
downloadgdb-9f8575350f980aa6da8c488c6aa30862620eaa1f.zip
gdb-9f8575350f980aa6da8c488c6aa30862620eaa1f.tar.gz
gdb-9f8575350f980aa6da8c488c6aa30862620eaa1f.tar.bz2
x86: Add _bfd_x86_elf_hide_symbol
When there is no dynamic interpreter in PIE, make the undefined weak symbol dynamic so that PC relative branch to the undefined weak symbol will land to address 0. * elf32-i386.c (elf_backend_hide_symbol): New. * elf64-x86-64.c (elf_backend_hide_symbol): Likewise. * elfxx-x86.c (_bfd_x86_elf_hide_symbol): Likewise. * elfxx-x86.h (_bfd_x86_elf_hide_symbol): Likewise.
Diffstat (limited to 'bfd/elfxx-x86.c')
-rw-r--r--bfd/elfxx-x86.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 4384430..dd139ca 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -1668,6 +1668,27 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
return _bfd_elf_adjust_dynamic_copy (info, h, s);
}
+void
+_bfd_x86_elf_hide_symbol (struct bfd_link_info *info,
+ struct elf_link_hash_entry *h,
+ bfd_boolean force_local)
+{
+ if (h->root.type == bfd_link_hash_undefweak
+ && info->nointerp
+ && bfd_link_pie (info))
+ {
+ /* When there is no dynamic interpreter in PIE, make the undefined
+ weak symbol dynamic so that PC relative branch to the undefined
+ weak symbol will land to address 0. */
+ struct elf_x86_link_hash_entry *eh = elf_x86_hash_entry (h);
+ if (h->plt.refcount > eh->func_pointer_refcount
+ || eh->plt_got.refcount > 0)
+ return;
+ }
+
+ _bfd_elf_link_hash_hide_symbol (info, h, force_local);
+}
+
/* Return TRUE if a symbol is referenced locally. It is similar to
SYMBOL_REFERENCES_LOCAL, but it also checks version script. It
works in check_relocs. */