[PATCH 2/2] elf: Defer arch PLT IFUNC relocations in the two-phase relocation split

Adhemerval Zanella adhemerval.zanella@linaro.org
Tue Jul 14 15:50:07 GMT 2026


The split introduced by commit 63b31c05a8a does not handle sparc
and (R_SPARC_JMP_IREL) powerpc64 (ELFv1, R_PPC64_JMP_IREL), which
are emited in some constructions.  Handle such cases on
elf_dynamic_is_Rel_irelative.

It fixes elf/tst-ifunc-fault-bindnow and elf/tst-ifunc-fault-lazy on
sparc64 (powerpc64 emits R_PPC64_IRELATIVE in both cases,
R_PPC64_JMP_IREL is emitted only when the ifunc is called, not just
referenced).

Checked with the elf tests on qemu sparc64 and powerpc64.
---
 elf/do-rel.h                           | 8 +++++++-
 sysdeps/powerpc/powerpc64/dl-machine.h | 1 +
 sysdeps/sparc/sparc32/dl-machine.h     | 1 +
 sysdeps/sparc/sparc64/dl-machine.h     | 1 +
 4 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/elf/do-rel.h b/elf/do-rel.h
index c7a8be368f0..77022447348 100644
--- a/elf/do-rel.h
+++ b/elf/do-rel.h
@@ -45,7 +45,13 @@ elf_dynamic_is_Rel_irelative (const ElfW(Rel) *reloc, const ElfW(Sym) *sym)
   return ((sym != NULL
 	   && ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC
 	   && sym->st_shndx != SHN_UNDEF)
-	  || r_type == ELF_MACHINE_IRELATIVE);
+	  || r_type == ELF_MACHINE_IRELATIVE
+# ifdef ELF_MACHINE_IRELATIVE_PLT
+	  /* Some ports resolve an IFUNC PLT slot for a local resolver with a
+	     dedicated reloc that carries no symboli.  */
+	  || r_type == ELF_MACHINE_IRELATIVE_PLT
+# endif
+	  );
 #else
   return false;
 #endif
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
index 1f5d7a0170b..f1ce639843e 100644
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
@@ -305,6 +305,7 @@ BODY_PREFIX "_dl_start_user:\n"						\
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT	R_PPC64_JMP_SLOT
 #define ELF_MACHINE_IRELATIVE	R_PPC64_IRELATIVE
+#define ELF_MACHINE_IRELATIVE_PLT R_PPC64_JMP_IREL
 
 /* We define an initialization function to initialize HWCAP/HWCAP2 and
    platform data so it can be copied into the TCB later.  This is called
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
index 3771339a04a..540e7d24e26 100644
--- a/sysdeps/sparc/sparc32/dl-machine.h
+++ b/sysdeps/sparc/sparc32/dl-machine.h
@@ -157,6 +157,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT	R_SPARC_JMP_SLOT
 #define ELF_MACHINE_IRELATIVE	R_SPARC_IRELATIVE
+#define ELF_MACHINE_IRELATIVE_PLT R_SPARC_JMP_IREL
 
 /* Undo the sub %sp, 6*4, %sp; add %sp, 22*4, %o0 below to get at the
    value we want in __libc_stack_end.  */
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index 8a1a38d1701..0885f4dc913 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -120,6 +120,7 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT	R_SPARC_JMP_SLOT
 #define ELF_MACHINE_IRELATIVE	R_SPARC_IRELATIVE
+#define ELF_MACHINE_IRELATIVE_PLT R_SPARC_JMP_IREL
 
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
-- 
2.43.0



More information about the Libc-alpha mailing list