[PATCH 0/2] sparc: Fix IFUNC startup and ldd-trace regressions
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Jul 14 15:50:05 GMT 2026
Patch 1 fixes BZ#34396: on a static (non-PIE) binary __libc_setup_tls
issuse _dl_allocate_tls_init which copies the TLS init image with the
IFUNC __mempcpy, which now runs before the static IFUNC (IRELATIVE)
relocations are applied, so the call jumps through an unrelocated PLT
slot and dies with SIGILL. It redirects the mem* routines reached on
that path to their non-IFUNC ultra1 implementations.
These problems escaped my own testing because the binutils I was using
has an ld that segfaults on glibc's gnu-indirect-function configure probe
(a NULL-name strcmp on a local STT_GNU_IFUNC, since binutils commit
fd82d5ddf57a). configure therefore recorded
libc_cv_ld_gnu_indirect_function=no and built glibc without multi-arch,
so no IFUNC was exercised at all.
With an working toolchain, running the sparc testsuite with patch 1 applied
exposed two further regressions:
FAIL: elf/tst-ifunc-fault-bindnow
FAIL: elf/tst-ifunc-fault-lazy
Patch 2 fixes those by proper handling R_SPARC_JMP_IREL. I also checked
other ABIs for similar issues and powerpc64 (ELFv1) uses a similar second
reloc (R_PPC64_JMP_IREL). The patch fixes it as well.
The existing tests do not catch it there because they only take the
resolver's *address*, which powerpc64 emits as R_PPC64_IRELATIVE; the
JMP_IREL slot is emitted only when the IFUNC is actually *called*. All
other ABIs use a single IRELATIVE type and are unaffected.
Adhemerval Zanella (2):
sparc: Fix static IFUNC startup crash by redirecting __mempcpy (BZ
#34396)
elf: Defer arch PLT IFUNC relocations in the two-phase relocation
split
elf/do-rel.h | 8 ++++++-
sysdeps/powerpc/powerpc64/dl-machine.h | 1 +
.../multiarch => }/dl-symbol-redir-ifunc.h | 13 +++++++++-
sysdeps/sparc/sparc32/dl-machine.h | 1 +
sysdeps/sparc/sparc64/dl-machine.h | 1 +
.../sparc64/multiarch/dl-symbol-redir-ifunc.h | 24 -------------------
6 files changed, 22 insertions(+), 26 deletions(-)
rename sysdeps/sparc/{sparc32/sparcv9/multiarch => }/dl-symbol-redir-ifunc.h (70%)
delete mode 100644 sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
--
2.43.0
More information about the Libc-alpha
mailing list