[PATCH 0/2] sparc: Fix IFUNC startup and ldd-trace regressions

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Jul 15 12:10:40 GMT 2026



On 15/07/26 09:00, Andreas K. Huettel wrote:
>> 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.
> [...]
>> 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.
> 
> Tested on sparc64 (catbus) and improves the situation a lot - down to 12 failures
> from >200. Feel free to add 
> 
> Tested-by: Andreas K. Hüttel <dilfridge@gentoo.org>

Thanks, I think I will install them by the end of the week.

> 
> In detail, the remaining failures are:
> 
> FAIL: elf/tst-pldd (*)
> FAIL: elf/tst-thp-1
> FAIL: elf/tst-thp-1-no-s-code
> FAIL: elf/tst-thp-1-no-s-code-pde
> FAIL: elf/tst-thp-1-no-s-code-static
> FAIL: elf/tst-thp-1-pde
> FAIL: elf/tst-thp-1-static

This is because PMD for THP on sparc is 8MB instead of default 2MB, this
should fix it:

diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile
index e0056c9413f..57e73d0a14d 100644
--- a/sysdeps/unix/sysv/linux/sparc/Makefile
+++ b/sysdeps/unix/sysv/linux/sparc/Makefile
@@ -14,3 +14,8 @@ endif
 ifeq ($(subdir),signal)
 sysdep_routines += sigreturn_stub
 endif
+
+ifeq ($(subdir),elf)
+# The sparc64 uses an 8KB base page and 8MB PMD transparent huge page
+THP-PAGE-SIZE = 0x800000
+endif

> FAIL: elf/tst-thp-align
> FAIL: math/test-float64x-float128-mul (*)
> FAIL: posix/tst-chmod
> FAIL: socket/tst-socket-timestamp (*)
> FAIL: stdlib/tst-setcontext2 (*)
>                 === Summary of results ===
>      12 FAIL
>    6727 PASS
>      70 UNSUPPORTED
>      17 XFAIL
>       2 XPASS
> 
> This machine was offline for a while; my last baseline is 2.41. 
> All tests marked (*) above already failed back then. About the remaining 
> regressions, all except one seem to be internally an identical problem:
> 
> elf/tst-thp-1.out:
> ===================================
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 6291456 (0x600000); from: from % thp_size
>   right: 0 (0x0); from: 0
> error: 1 test failures
> 
> elf/tst-thp-1-no-s-code.out:
> ===================================
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 4194304 (0x400000); from: from % thp_size
>   right: 0 (0x0); from: 0
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 4194304 (0x400000); from: from % thp_size
>   right: 0 (0x0); from: 0
> error: 2 test failures
> 
> elf/tst-thp-1-no-s-code-pde.out:
> ===================================
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 2097152 (0x200000); from: from % thp_size
>   right: 0 (0x0); from: 0
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 2097152 (0x200000); from: from % thp_size
>   right: 0 (0x0); from: 0
> error: 2 test failures
> 
> elf/tst-thp-1-no-s-code-static.out:
> ===================================
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 2097152 (0x200000); from: from % thp_size
>   right: 0 (0x0); from: 0
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 2097152 (0x200000); from: from % thp_size
>   right: 0 (0x0); from: 0
> error: 2 test failures
> 
> elf/tst-thp-align.out:
> ===================================
> ../sysdeps/unix/sysv/linux/tst-thp-align-check.h:59: numeric comparison failure (widths 64 and 32)
>    left: 4194304 (0x400000); from: from % thp_size
>   right: 0 (0x0); from: 0
> error: 1 test failures
> 
> posix/tst-chmod.out:
> ===================================
> chmod(".../file",0600) did not set ctime correctly
> 
> 
> 
> 
> 
> 
> 
>>
>> 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
>>
>>
> 
> 



More information about the Libc-alpha mailing list