PPC: ensure_undef_dynamic on weak undef only in plt

Alan Modra amodra@gmail.com
Mon May 3 05:03:08 GMT 2021


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.

diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index d6ed501245c..2199465dbf8 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 ed72de27507..bc960bf8e9d 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)

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list