diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-10-12 02:12:47 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-10-12 02:14:34 -0700 |
commit | 9f8575350f980aa6da8c488c6aa30862620eaa1f (patch) | |
tree | b0bc03bd7456aad7444e20a511405cf3ab4ccce4 /bfd/elfxx-x86.c | |
parent | 359987e21867b730564ff46ddceaafdc93d0fb49 (diff) | |
download | gdb-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.c | 21 |
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. */ |