diff options
author | Alan Modra <amodra@gmail.com> | 2021-05-03 10:03:06 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-05-03 15:34:17 +0930 |
commit | b293661219c36e72acb80502a86b51160bb88cfd (patch) | |
tree | deebfdb320ad07d4ca226983cb4346ae81efebaf | |
parent | 337d0bf887a3ed6b6b2123fecfec0736640edcaf (diff) | |
download | gdb-b293661219c36e72acb80502a86b51160bb88cfd.zip gdb-b293661219c36e72acb80502a86b51160bb88cfd.tar.gz gdb-b293661219c36e72acb80502a86b51160bb88cfd.tar.bz2 |
PPC: ensure_undef_dynamic on weak undef only in plt
It's slightly weird to have a call to a weak function not protected by
a test of that function being non-NULL, but the non-NULL test might be
covered by a test of another function. For example:
if (func1)
{
func1 ();
func2 ();
}
where func2 is known to exist if func1 exists.
* 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.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 9 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 3 |
3 files changed, 16 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fc7a1b8..293fd99 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,11 @@ 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. + +2021-05-03 Alan Modra <amodra@gmail.com> + PR 27755 * elf32-ppc.c (ppc_elf_inline_plt): Do increment rel in loop. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 830c920..ff618e4 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -5296,9 +5296,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) for (ent = h->plt.plist; ent != NULL; ent = ent->next) if (ent->plt.refcount > 0) { - asection *s = htab->elf.splt; - bool dyn = !use_local_plt (info, h); + asection *s; + bool dyn; + if (!ensure_undef_dynamic (info, h)) + return false; + + dyn = !use_local_plt (info, h); + s = htab->elf.splt; if (!dyn) { if (h->type == STT_GNU_IFUNC) diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index ed72de2..bc960bf 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9855,6 +9855,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) for (pent = h->plt.plist; pent != NULL; pent = pent->next) if (pent->plt.refcount > 0) { + if (!ensure_undef_dynamic (info, h)) + return false; + if (use_local_plt (info, h)) { if (h->type == STT_GNU_IFUNC) |