diff options
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 6 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 6 |
3 files changed, 18 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 293fd99..cdcf5d7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,13 @@ 2021-05-03 Alan Modra <amodra@gmail.com> + * elf32-ppc.c (allocate_dynrelocs): Keep dyn_relocs for undefweak + symbols when -z dynamic-undefined-weak or when there are no + dynamic relocs in read-only sections and -z nodynamic-undefined-weak + is not given. + * elf64-ppc.c (allocate_dynrelocs): Likewise. + +2021-05-03 Alan Modra <amodra@gmail.com> + * elf32-ppc.c (allocate_dynrelocs): Call ensure_undef_dynamic for weak undefined symols that only appear on PLT relocs. * elf64-ppc.c (allocate_dynrelocs): Likewise. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index ff618e4..34a6b3f 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5245,7 +5245,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* For the non-pic case, discard space for relocs against symbols which turn out to need copy relocs or are not dynamic. */ - if (h->dynamic_adjusted + if ((h->dynamic_adjusted + || (h->ref_regular + && h->root.type == bfd_link_hash_undefweak + && (info->dynamic_undefined_weak > 0 + || !_bfd_elf_readonly_dynrelocs (h)))) && !h->def_regular && !ELF_COMMON_DEF_P (h) && !(h->protected_def diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index bc960bf..a4a0530 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9808,7 +9808,11 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) relocs against symbols which are not dynamic. */ else if (h->type != STT_GNU_IFUNC) { - if (h->dynamic_adjusted + if ((h->dynamic_adjusted + || (h->ref_regular + && h->root.type == bfd_link_hash_undefweak + && (info->dynamic_undefined_weak > 0 + || !_bfd_elf_readonly_dynrelocs (h)))) && !h->def_regular && !ELF_COMMON_DEF_P (h)) { |