aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-s390.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/elf64-s390.c')
-rw-r--r--bfd/elf64-s390.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index 73d0331..c126880 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -1890,7 +1890,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h,
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
{
- if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+ || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
@@ -2307,6 +2308,7 @@ elf_s390_relocate_section (bfd *output_bfd,
bfd_reloc_status_type r;
int tls_type;
asection *base_got = htab->elf.sgot;
+ bfd_boolean resolved_to_zero;
r_type = ELF64_R_TYPE (rel->r_info);
if (r_type == (int) R_390_GNU_VTINHERIT
@@ -2402,6 +2404,9 @@ elf_s390_relocate_section (bfd *output_bfd,
if (bfd_link_relocatable (info))
continue;
+ resolved_to_zero = (h != NULL
+ && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
+
switch (r_type)
{
case R_390_GOTPLT12:
@@ -2804,7 +2809,8 @@ elf_s390_relocate_section (bfd *output_bfd,
if ((bfd_link_pic (info)
&& (h == NULL
- || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+ || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+ && !resolved_to_zero)
|| h->root.type != bfd_link_hash_undefweak)
&& ((r_type != R_390_PC16
&& r_type != R_390_PC12DBL