[PATCH v2 4/5] Fix assert during static startup
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Sep 2 19:26:56 GMT 2025
The BZ#33326 testcase triggers an assertion during process startup,
which results in a segmentation fault instead of an error message and
process termination with a SIGABRT. The assert issues
__libc_message_impl, which in turn might call string functions
depending on the ABI (strchrnul, strlen, memcpy/mempcpy), system calls
(writev and mmap), and finally the abort call.
Since each function may be called during process startup, before
self-relocation and/or the thread pointer being set up, the functions
should be built without stack protection.
The dl-symbol-redir-ifunc.h is also expanded to cover
strlen/memcpy/mempcpy/strchrnul on multiple architectures that implement
ifunc.
On i386, syscalls should not use the vDSO ("call *%gs:SYSINFO_OFFSET"),
so a raise_nostatus.c and mmap call is added that disables
I386_USE_SYSENTER.
The s390x requires to not call libgcc for the generic strchrnul-c
(through ctz/clz macros) due a libgcc issue where the __clzdi2 builtin
is not built against a hidden reference to __clz_tab, which creates
a GOT reference for static-pie (and it can not be called before
self-relocation).
Creating a test case is challenging. For static-pie, the assert is only
called for ill-formatted ELF files on elf_get_dynamic_info and by some
targets on ELF_DYNAMIC_RELOCATE (although not all targets use assert in
their dl-machine.h). Some targets also issue __libc_fatal on
ARCH_SETUP_IREL, but also only for ill-formatted ELF files.
The test employs a different strategy and overrides the __tunables_init
symbol, which is invoked immediately before self-relocation and TLS setup.
The test is built with -Wl,-z,muldefs to avoid linker issues.
I checked on aarch64, x86_64, i686, s390x (qemu), sparc (qemu),
mips64el (qemu), armhf, riscv, and powerpc.
---
assert/Makefile | 5 +++
elf/Makefile | 16 ++++++++
elf/tst-assert-startup-static.c | 35 +++++++++++++++++
libio/Makefile | 5 +++
signal/Makefile | 10 +++++
stdlib/Makefile | 5 +++
string/Makefile | 2 +
.../aarch64/multiarch/dl-symbol-redir-ifunc.h | 2 +
sysdeps/aarch64/multiarch/memcpy_generic.S | 4 ++
sysdeps/aarch64/multiarch/strlen_generic.S | 4 ++
sysdeps/generic/dl-mmap.h | 34 +++++++++++++++++
.../lp64/multiarch/dl-symbol-redir-ifunc.h | 3 ++
sysdeps/posix/libc_fatal.c | 12 ++++--
.../powerpc32/power4/multiarch/Makefile | 5 +++
.../be/multiarch/dl-symbol-redir-ifunc.h | 27 +++++++++++++
.../le/multiarch/dl-symbol-redir-ifunc.h | 1 +
sysdeps/powerpc/powerpc64/multiarch/Makefile | 1 +
sysdeps/s390/Makefile | 5 +++
.../s390/multiarch/dl-symbol-redir-ifunc.h | 4 ++
sysdeps/s390/string-bitops.h | 27 +++++++++++++
.../sparcv9/multiarch/dl-symbol-redir-ifunc.h | 3 ++
.../sparc64/multiarch/dl-symbol-redir-ifunc.h | 3 ++
sysdeps/unix/sysv/linux/Makefile | 5 +++
sysdeps/unix/sysv/linux/dl-mmap.h | 34 +++++++++++++++++
sysdeps/unix/sysv/linux/i386/dl-mmap.h | 38 +++++++++++++++++++
sysdeps/unix/sysv/linux/i386/raise_nostatus.c | 26 +++++++++++++
.../unix/sysv/linux/riscv/multiarch/Makefile | 5 +++
.../riscv/multiarch/dl-symbol-redir-ifunc.h | 26 +++++++++++++
.../x86_64/multiarch/dl-symbol-redir-ifunc.h | 33 ++++++++++++++++
29 files changed, 377 insertions(+), 3 deletions(-)
create mode 100644 elf/tst-assert-startup-static.c
create mode 100644 sysdeps/generic/dl-mmap.h
create mode 100644 sysdeps/powerpc/powerpc64/be/multiarch/dl-symbol-redir-ifunc.h
create mode 100644 sysdeps/s390/string-bitops.h
create mode 100644 sysdeps/unix/sysv/linux/dl-mmap.h
create mode 100644 sysdeps/unix/sysv/linux/i386/dl-mmap.h
create mode 100644 sysdeps/unix/sysv/linux/i386/raise_nostatus.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/dl-symbol-redir-ifunc.h
diff --git a/assert/Makefile b/assert/Makefile
index 8d106d8752..a77362e685 100644
--- a/assert/Makefile
+++ b/assert/Makefile
@@ -33,6 +33,11 @@ routines := \
assert-perr \
# routines
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-__libc_assert_fail.o = $(no-stack-protector)
+CFLAGS-__libc_assert_fail.op = $(no-stack-protector)
+
tests := \
test-assert \
test-assert-2 \
diff --git a/elf/Makefile b/elf/Makefile
index 5a676f858d..07504e1f74 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -282,6 +282,7 @@ tests-static-normal := \
# tests-static-normal
tests-static-internal := \
+ tst-assert-startup-static \
tst-dl-printf-static \
tst-dl_find_object-static \
tst-env-setuid-tunables \
@@ -293,6 +294,10 @@ tests-static-internal := \
tst-tunables-enable_secure \
# tests-static-internal
+tests-special += \
+ $(objpfx)tst-assert-startup-static.out \
+ # tests-special
+
CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
tst-tls1-static-non-pie-no-pie = yes
@@ -3519,3 +3524,14 @@ $(objpfx)tst-origin.out: tst-origin.sh $(objpfx)tst-origin
$(evaluate-test)
$(objpfx)tst-dlopen-sgid.out: $(objpfx)tst-dlopen-sgid-mod.so
+
+CFLAGS-tst-assert-startup-static.c += $(no-stack-protector)
+LDFLAGS-tst-assert-startup-static = -Wl,-z,muldefs
+
+$(objpfx)tst-assert-startup-static.out: $(objpfx)tst-assert-startup-static
+ $(test-program-cmd-before-env) \
+ $(run-program-env) \
+ $< > $@ 2>&1; echo "status: $$?" >> $@; \
+ grep -q 'Fatal glibc error: tst-assert-startup-static' $@ \
+ && grep -q '^status: 134$$' $@; \
+ $(evaluate-test)
diff --git a/elf/tst-assert-startup-static.c b/elf/tst-assert-startup-static.c
new file mode 100644
index 0000000000..66f6ccfd4c
--- /dev/null
+++ b/elf/tst-assert-startup-static.c
@@ -0,0 +1,35 @@
+/* Check if assert work during program startup.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <assert.h>
+
+/* The __tunables_init is called just before self-relocation and TLS setup,
+ and the __libc_assert_fail is used internally for assert() calls. */
+extern _Noreturn __typeof (__assert_fail) __libc_assert_fail;
+
+void __tunables_init (char **env)
+{
+ __libc_assert_fail ("error", __FILE__, __LINE__, __func__);
+}
+
+int main (int argc, char *argv[])
+{
+ /* Fail with a different error code than abort(). */
+ exit (EXIT_FAILURE);
+}
diff --git a/libio/Makefile b/libio/Makefile
index 6ce669e103..01b2958112 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -180,6 +180,11 @@ endif
CPPFLAGS += $(libio-mtsafe)
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-libc_fatal.o = $(no-stack-protector)
+CFLAGS-libc_fatal.op = $(no-stack-protector)
+
# Support for exception handling.
CFLAGS-fileops.c += -fexceptions
CFLAGS-fputc.c += -fexceptions
diff --git a/signal/Makefile b/signal/Makefile
index 468a8b93f0..af57346e98 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -65,6 +65,11 @@ tests := \
include ../Rules
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-raise.o = $(no-stack-protector)
+CFLAGS-raise.op = $(no-stack-protector)
+
CFLAGS-raise.c += -fasynchronous-unwind-tables
CFLAGS-sigpause.c += -fexceptions
CFLAGS-sigsuspend.c += -fexceptions -fasynchronous-unwind-tables
@@ -74,6 +79,11 @@ CFLAGS-sigwaitinfo.c += -fexceptions -fasynchronous-unwind-tables
CFLAGS-sigreturn.c += $(no-stack-protector)
+# It is also called during static library initialization (during abort()/assert()),
+# so turn stack-protection off for non-shared builds.
+CFLAGS-raise_nostatus.o = $(no-stack-protector)
+CFLAGS-raise_nostatus.op = $(no-stack-protector)
+
# We don't want to test the lazy resolution stack usage, just the
# execution of the handler and the functions.
LDFLAGS-tst-minsigstksz-1 = -Wl,-z,now
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 25f777e1a5..f867f0ce80 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -518,6 +518,11 @@ generated += \
tst-putenvmod.so \
# generated
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-abort.o = $(no-stack-protector)
+CFLAGS-abort.op = $(no-stack-protector)
+
CFLAGS-bsearch.c += $(uses-callbacks)
CFLAGS-qsort.c += $(uses-callbacks)
CFLAGS-system.c += -fexceptions
diff --git a/string/Makefile b/string/Makefile
index c83b195e2e..411dd03a21 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -278,6 +278,8 @@ CFLAGS-wordcopy.c += $(no-stack-protector)
# Called during static initialization
CFLAGS-strncmp.c += $(no-stack-protector)
CFLAGS-memset.c += $(no-stack-protector)
+CFLAGS-strlen.c += $(no-stack-protector)
+CFLAGS-strchrnul.c += $(no-stack-protector)
CFLAGS-argz-next.c += $(config-cflags-wno-ignored-attributes)
CFLAGS-basename.c += $(config-cflags-wno-ignored-attributes)
diff --git a/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h
index 63ac28f50f..4646d6a137 100644
--- a/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h
@@ -19,6 +19,8 @@
#ifndef _DL_IFUNC_GENERIC_H
#define _DL_IFUNC_GENERIC_H
+asm ("memcpy = __memcpy_generic");
asm ("memset = __memset_generic");
+asm ("strlen = __strlen_generic");
#endif
diff --git a/sysdeps/aarch64/multiarch/memcpy_generic.S b/sysdeps/aarch64/multiarch/memcpy_generic.S
index f044ebcdec..1d783199bc 100644
--- a/sysdeps/aarch64/multiarch/memcpy_generic.S
+++ b/sysdeps/aarch64/multiarch/memcpy_generic.S
@@ -42,3 +42,7 @@
#endif
#include "../memcpy.S"
+
+#if IS_IN (rtld)
+strong_alias (memcpy, __memcpy_generic)
+#endif
diff --git a/sysdeps/aarch64/multiarch/strlen_generic.S b/sysdeps/aarch64/multiarch/strlen_generic.S
index 270586c451..effb98085b 100644
--- a/sysdeps/aarch64/multiarch/strlen_generic.S
+++ b/sysdeps/aarch64/multiarch/strlen_generic.S
@@ -40,3 +40,7 @@
#endif
#include "../strlen.S"
+
+#if IS_IN (rtld)
+strong_alias (strlen, __strlen_generic)
+#endif
diff --git a/sysdeps/generic/dl-mmap.h b/sysdeps/generic/dl-mmap.h
new file mode 100644
index 0000000000..bed3523422
--- /dev/null
+++ b/sysdeps/generic/dl-mmap.h
@@ -0,0 +1,34 @@
+/* mmap wrapper for dynamic loader.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _DL_MMAP_H
+#define _DL_MMAP_H
+
+#include <sys/mman.h>
+
+/* This mmap call is used to allocate some memory to backup assert() messages
+ before TLS setup is done (which setup the thread pointer used by some ABIs
+ to issues syscalls). */
+
+static inline void *
+_dl_mmap (void *addr, size_t len, int prot, int flags)
+{
+ return __mmap (addr, len, prot, flags, -1, 0);
+}
+
+#endif
diff --git a/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h
index 9b43cdda69..bc00b411b1 100644
--- a/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/loongarch/lp64/multiarch/dl-symbol-redir-ifunc.h
@@ -20,8 +20,11 @@
#define _DL_IFUNC_GENERIC_H
#ifndef SHARED
+asm ("memcpy = __memcpy_aligned");
asm ("memset = __memset_aligned");
asm ("memcmp = __memcmp_aligned");
+asm ("__strchrnul = __strchrnul_aligned");
+asm ("strlen = __strlen_aligned");
#endif
#endif
diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c
index c36bd39c13..875bf9ecf9 100644
--- a/sysdeps/posix/libc_fatal.c
+++ b/sysdeps/posix/libc_fatal.c
@@ -16,7 +16,12 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
+/* Mark symbols hidden in static PIE for early self relocation to work. */
+#if BUILD_PIE_DEFAULT
+# pragma GCC visibility push(hidden)
+#endif
#include <dl-writev.h>
+#include <dl-mmap.h>
#include <assert.h>
#include <ldsodefs.h>
#include <setvmaname.h>
@@ -24,6 +29,7 @@
#include <stdio.h>
#include <sys/uio.h>
#include <unistd.h>
+#include <dl-symbol-redir-ifunc.h>
#ifdef FATAL_PREPARE_INCLUDE
#include FATAL_PREPARE_INCLUDE
@@ -113,9 +119,9 @@ __libc_message_impl (const char *fmt, ...)
total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1,
GLRO(dl_pagesize));
- struct abort_msg_s *buf = __mmap (NULL, total,
- PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE, -1, 0);
+ struct abort_msg_s *buf = _dl_mmap (NULL, total,
+ PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE);
if (__glibc_likely (buf != MAP_FAILED))
{
buf->size = total;
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile
index 3a49b855ca..60ba2e50d2 100644
--- a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile
@@ -11,4 +11,9 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \
strchr-power7 strchr-ppc32 \
wordcopy-power7 wordcopy-ppc32 \
memmove-power7 memmove-ppc
+
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-strchrnul-ppc32.o = $(no-stack-protector)
+CFLAGS-strchrnul-ppc32.op = $(no-stack-protector)
endif
diff --git a/sysdeps/powerpc/powerpc64/be/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/powerpc/powerpc64/be/multiarch/dl-symbol-redir-ifunc.h
new file mode 100644
index 0000000000..9a30f21ecd
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/be/multiarch/dl-symbol-redir-ifunc.h
@@ -0,0 +1,27 @@
+/* Symbol rediretion for loader/static initialization code.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _DL_IFUNC_GENERIC_H
+#define _DL_IFUNC_GENERIC_H
+
+#ifndef SHARED
+asm ("__mempcpy = __mempcpy_ppc");
+asm ("__strchrnul = __strchrnul_ppc");
+#endif
+
+#endif
diff --git a/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h
index 93276e1578..b1d237eadc 100644
--- a/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h
@@ -21,5 +21,6 @@
asm ("memset = __memset_power8");
asm ("__mempcpy = __mempcpy_power7");
+asm ("__strchrnul = __strchrnul_power8");
#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
index e321ce54e0..6408176ebc 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
@@ -40,3 +40,4 @@ endif
# Called during static initialization
CFLAGS-strncmp-ppc64.c += $(no-stack-protector)
+CFLAGS-strchrnul-ppc64.c += $(no-stack-protector)
diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/Makefile
index 985b4f25ee..078c0d165d 100644
--- a/sysdeps/s390/Makefile
+++ b/sysdeps/s390/Makefile
@@ -104,6 +104,11 @@ routines_no_fortify += \
# routines_no_fortify
endif
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-strchrnul-c.o = $(no-stack-protector)
+CFLAGS-strchrnul-c.op = $(no-stack-protector)
+
ifeq ($(subdir),wcsmbs)
sysdep_routines += wcslen wcslen-vx wcslen-c \
wcsnlen wcsnlen-vx wcsnlen-c \
diff --git a/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h
index c34907c20c..e921ca6e6b 100644
--- a/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h
@@ -21,11 +21,15 @@
#include <ifunc-memset.h>
#include <ifunc-memcmp.h>
+#include <ifunc-strchrnul.h>
#define IFUNC_SYMBOL_STR1(s) #s
#define IFUNC_SYMBOL_STR(s) IFUNC_SYMBOL_STR1(s)
+#ifndef SHARED
asm ("memset = " IFUNC_SYMBOL_STR(MEMSET_DEFAULT));
asm ("memcmp = " IFUNC_SYMBOL_STR(MEMCMP_DEFAULT));
+asm ("__strchrnul = " IFUNC_SYMBOL_STR(STRCHRNUL_DEFAULT));
+#endif
#endif
diff --git a/sysdeps/s390/string-bitops.h b/sysdeps/s390/string-bitops.h
new file mode 100644
index 0000000000..408d18c7a7
--- /dev/null
+++ b/sysdeps/s390/string-bitops.h
@@ -0,0 +1,27 @@
+/* Zero byte detection, define whether to use stdbit.h
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* s390x support static-pie and the libgcc implementation for
+ __builtin_clzl/__builtin_ctzl might access extern data that is not marked
+ as hidden, which creates additiona GOT access that is used before
+ self-relocation. */
+#if __ARCH__ > 6
+# define HAVE_BITOPTS_WORKING 1
+#else
+# define HAVE_BITOPTS_WORKING 0
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h
index 12ff2a03fa..9cd78de2bf 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h
@@ -19,6 +19,9 @@
#ifndef _DL_IFUNC_GENERIC_H
#define _DL_IFUNC_GENERIC_H
+#ifndef SHARED
asm ("memset = __memset_ultra1");
+asm ("memcpy = __memcpy_ultra1");
+#endif
#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
index 12ff2a03fa..9cd78de2bf 100644
--- a/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
@@ -19,6 +19,9 @@
#ifndef _DL_IFUNC_GENERIC_H
#define _DL_IFUNC_GENERIC_H
+#ifndef SHARED
asm ("memset = __memset_ultra1");
+asm ("memcpy = __memcpy_ultra1");
+#endif
#endif
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 2c5bf42236..bb74b4aca8 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -114,6 +114,11 @@ sysdep_routines += \
xstat \
xstat64 \
# sysdep_routines
+#
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-setvmaname.o = $(no-stack-protector)
+CFLAGS-setvmaname.op = $(no-stack-protector)
CFLAGS-gethostid.c = -fexceptions
CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables
diff --git a/sysdeps/unix/sysv/linux/dl-mmap.h b/sysdeps/unix/sysv/linux/dl-mmap.h
new file mode 100644
index 0000000000..bed3523422
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/dl-mmap.h
@@ -0,0 +1,34 @@
+/* mmap wrapper for dynamic loader.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _DL_MMAP_H
+#define _DL_MMAP_H
+
+#include <sys/mman.h>
+
+/* This mmap call is used to allocate some memory to backup assert() messages
+ before TLS setup is done (which setup the thread pointer used by some ABIs
+ to issues syscalls). */
+
+static inline void *
+_dl_mmap (void *addr, size_t len, int prot, int flags)
+{
+ return __mmap (addr, len, prot, flags, -1, 0);
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/i386/dl-mmap.h b/sysdeps/unix/sysv/linux/i386/dl-mmap.h
new file mode 100644
index 0000000000..b036f32864
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/dl-mmap.h
@@ -0,0 +1,38 @@
+/* mmap wrapper for dynamic loader.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _DL_MMAP_H
+#define _DL_MMAP_H
+
+#include <sys/mman.h>
+#include <mmap_internal.h>
+
+/* This mmap call is used to allocate some memory to backup assert() messages
+ before TLS setup is done, so it can not use "call *%gs:SYSINFO_OFFSET"
+ during startup in static PIE. */
+#if BUILD_PIE_DEFAULT
+# define I386_USE_SYSENTER 0
+#endif
+
+static inline void *
+_dl_mmap (void *addr, size_t len, int prot, int flags)
+{
+ return (void *) MMAP_CALL (mmap2, addr, len, prot, flags, -1, 0);
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/i386/raise_nostatus.c b/sysdeps/unix/sysv/linux/i386/raise_nostatus.c
new file mode 100644
index 0000000000..d4099b273b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/raise_nostatus.c
@@ -0,0 +1,26 @@
+/* Send a signal to a specific pthread. Stub version.
+ Copyright (C) 2014-2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* This is called from abort() (issued by ssert()) before TLS setup is done,
+ so it can not use "call *%gs:SYSINFO_OFFSET" during startup in static
+ PIE. */
+#if BUILD_PIE_DEFAULT
+# define I386_USE_SYSENTER 0
+#endif
+
+#include <sysdeps/unix/sysv/linux/raise_nostatus.c>
diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile
index fcef5659d4..c7d19c18c7 100644
--- a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile
+++ b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile
@@ -5,5 +5,10 @@ sysdep_routines += \
memcpy_noalignment \
# sysdep_routines
+# Called during static library initialization, so turn stack-protection
+# off for non-shared builds.
+CFLAGS-memcpy-generic.o = $(no-stack-protector)
+CFLAGS-memcpy-generic.op = $(no-stack-protector)
+
CFLAGS-memcpy_noalignment.c += -mno-strict-align
endif
diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/unix/sysv/linux/riscv/multiarch/dl-symbol-redir-ifunc.h
new file mode 100644
index 0000000000..ae38926a5c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/riscv/multiarch/dl-symbol-redir-ifunc.h
@@ -0,0 +1,26 @@
+/* Symbol rediretion for loader/static initialization code.
+ Copyright (C) 2025 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _DL_IFUNC_GENERIC_H
+#define _DL_IFUNC_GENERIC_H
+
+#ifndef SHARED
+asm ("memcpy = __memcpy_generic");
+#endif
+
+#endif
diff --git a/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h
index 163b25d096..a31f91c329 100644
--- a/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h
@@ -44,6 +44,39 @@ asm ("memset = " HAVE_MEMSET_IFUNC_GENERIC);
asm ("memcmp = " HAVE_MEMCMP_IFUNC_GENERIC);
+
+#if MINIMUM_X86_ISA_LEVEL >= 4
+# define HAVE_MEMPCPY_IFUNC_GENERIC "__mempcpy_evex_unaligned"
+#elif MINIMUM_X86_ISA_LEVEL == 3
+# define HAVE_MEMPCPY_IFUNC_GENERIC "__mempcpy_avx2_unaligned"
+#else
+# define HAVE_MEMPCPY_IFUNC_GENERIC "__mempcpy_sse2_unaligned"
+#endif
+
+asm ("__mempcpy = " HAVE_MEMPCPY_IFUNC_GENERIC);
+
+
+#if MINIMUM_X86_ISA_LEVEL >= 4
+# define HAVE_STRCHRNUL_IFUNC_GENERIC "__strchrnul_evex"
+#elif MINIMUM_X86_ISA_LEVEL == 3
+# define HAVE_STRCHRNUL_IFUNC_GENERIC "__strchrnul_avx2"
+#else
+# define HAVE_STRCHRNUL_IFUNC_GENERIC "__strchrnul_sse2"
+#endif
+
+asm ("__strchrnul = " HAVE_STRCHRNUL_IFUNC_GENERIC);
+
+
+#if MINIMUM_X86_ISA_LEVEL >= 4
+# define HAVE_STRLEN_IFUNC_GENERIC "__strlen_evex"
+#elif MINIMUM_X86_ISA_LEVEL == 3
+# define HAVE_STRLEN_IFUNC_GENERIC "__strlen_avx2"
+#else
+# define HAVE_STRLEN_IFUNC_GENERIC "__strlen_sse2"
+#endif
+
+asm ("strlen = " HAVE_STRLEN_IFUNC_GENERIC);
+
#endif /* SHARED */
#endif
--
2.43.0
More information about the Libc-alpha
mailing list