diff options
author | Alan Modra <amodra@gmail.com> | 2017-04-27 09:19:26 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-04-27 11:54:29 +0930 |
commit | 21d68fcd0c2f9113369d860ee1e5841bfacc35ff (patch) | |
tree | 98f9e9c68823816e5df6d5882b72e16d392d602b /bfd/elf64-ppc.c | |
parent | a61d92b7bd4da998dd5d73e9205b4871f7c4825d (diff) | |
download | gdb-21d68fcd0c2f9113369d860ee1e5841bfacc35ff.zip gdb-21d68fcd0c2f9113369d860ee1e5841bfacc35ff.tar.gz gdb-21d68fcd0c2f9113369d860ee1e5841bfacc35ff.tar.bz2 |
PowerPC undefweak handling
This patch fixes a number of cases where -z nodynamic-undefined-weak
was not effective in preventing dynamic relocations or linkage stubs.
* elf32-ppc.c (UNDEFWEAK_NO_DYNAMIC_RELOC): Define.
(ppc_elf_select_plt_layout, ppc_elf_tls_setup): Use it.
(ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs): Likewise.
(ppc_elf_relocate_section): Likewise. Delete silly optimisation
for undef and undefweak dyn_relocs.
* elf64-ppc.c (UNDEFWEAK_NO_DYNAMIC_RELOC): Define.
(ppc64_elf_adjust_dynamic_symbol, ppc64_elf_tls_setup): Use it.
(allocate_got, allocate_dynrelocs): Likewise.
(ppc64_elf_relocate_section): Likewise.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 2e8f338..a20d9b3 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -3820,6 +3820,13 @@ must_be_dyn_reloc (struct bfd_link_info *info, } } +/* Whether an undefined weak symbol should resolve to its link-time + value, even in PIC or PIE objects. */ +#define UNDEFWEAK_NO_DYNAMIC_RELOC(INFO, H) \ + ((H)->root.type == bfd_link_hash_undefweak \ + && (ELF_ST_VISIBILITY ((H)->other) != STV_DEFAULT \ + || (INFO)->dynamic_undefined_weak == 0)) + /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid copying dynamic variables from a shared lib into an app's dynbss section, and instead use a dynamic relocation to point into the @@ -7297,8 +7304,7 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info, if (ent == NULL || (h->type != STT_GNU_IFUNC && (SYMBOL_CALLS_LOCAL (info, h) - || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT - && h->root.type == bfd_link_hash_undefweak))) + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))) || ((struct ppc_link_hash_entry *) h)->save_res) { h->plt.plist = NULL; @@ -8354,8 +8360,7 @@ ppc64_elf_tls_setup (struct bfd_link_info *info) && (tga_fd->type == STT_FUNC || tga_fd->needs_plt) && !(SYMBOL_CALLS_LOCAL (info, tga_fd) - || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT - && tga_fd->root.type == bfd_link_hash_undefweak))) + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd))) { struct plt_entry *ent; @@ -9659,8 +9664,7 @@ allocate_got (struct elf_link_hash_entry *h, || (htab->elf.dynamic_sections_created && h->dynindx != -1 && !SYMBOL_REFERENCES_LOCAL (info, h))) - && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT - || h->root.type != bfd_link_hash_undefweak)) + && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) { asection *relgot = ppc64_elf_tdata (gent->owner)->relgot; relgot->size += rentsize; @@ -9795,9 +9799,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* Also discard relocs on undefined weak syms with non-default visibility, or when dynamic_undefined_weak says so. */ - else if (h->root.type == bfd_link_hash_undefweak - && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT - || info->dynamic_undefined_weak == 0)) + else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) eh->dyn_relocs = NULL; if (eh->dyn_relocs != NULL) @@ -14458,8 +14460,7 @@ ppc64_elf_relocate_section (bfd *output_bfd, if (!htab->elf.dynamic_sections_created || h->elf.dynindx == -1 || SYMBOL_REFERENCES_LOCAL (info, &h->elf) - || (ELF_ST_VISIBILITY (h->elf.other) != STV_DEFAULT - && h->elf.root.type == bfd_link_hash_undefweak)) + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)) /* This is actually a static link, or it is a -Bsymbolic link and the symbol is defined locally, or the symbol was forced to be local @@ -14525,9 +14526,7 @@ ppc64_elf_relocate_section (bfd *output_bfd, else if (indx != 0 || (bfd_link_pic (info) && (h == NULL - || (ELF_ST_VISIBILITY (h->elf.other) - == STV_DEFAULT) - || h->elf.root.type != bfd_link_hash_undefweak + || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf) || (tls_type == (TLS_TLS | TLS_LD) && !h->elf.def_dynamic)))) relgot = ppc64_elf_tdata (ent->owner)->relgot; |