From 10e7c0457cb7531f8b205e29e88b3e191cfa6037 Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Fri, 8 Dec 2017 17:23:56 +0100 Subject: S/390: Fix (some) PIE+undef weak failures This fixes these failures on 64 bit which currently occur when running the Binutils testsuite with a default PIE compiler. < FAIL: Build rdynamic-1 < FAIL: Build dynamic-1 < FAIL: Build pr22269-1 bfd/ChangeLog: 2017-12-13 Andreas Krebbel * elf64-s390.c (elf_s390_adjust_dynamic_symbol): Use UNDEFWEAK_NO_DYNAMIC_RELOC. (allocate_dynrelocs): Likewise. (elf_s390_relocate_section): Check resolved_to_zero. (elf_s390_finish_dynamic_symbol): Don't generate runtime reloc if UNDEFWEAK_NO_DYNAMIC_RELOC. --- bfd/elf64-s390.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'bfd/elf64-s390.c') diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index a7a8445..0936e78 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -1433,8 +1433,7 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, { if (h->plt.refcount <= 0 || 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)) { /* This case can occur if we saw a PLT32 reloc in an input file, but the symbol was never referred to by a dynamic @@ -1669,8 +1668,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, htab->elf.srelgot->size += sizeof (Elf64_External_Rela); else if (tls_type == GOT_TLS_GD) htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela); - else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT - || h->root.type != bfd_link_hash_undefweak) + else if (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, h) && (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) htab->elf.srelgot->size += sizeof (Elf64_External_Rela); @@ -2313,8 +2311,7 @@ elf_s390_relocate_section (bfd *output_bfd, h) || (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) - || (ELF_ST_VISIBILITY (h->other) - && h->root.type == bfd_link_hash_undefweak)) + || resolved_to_zero) { /* This is actually a static link, or it is a -Bsymbolic link and the symbol is defined @@ -3417,6 +3414,9 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, else if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) { + if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + return TRUE; + /* If this is a static link, or it is a -Bsymbolic link and the symbol is defined locally or was forced to be local because of a version file, we just want to emit a -- cgit v1.1