[PATCH 1/2] sparc: Fix static IFUNC startup crash by redirecting __mempcpy (BZ #34396)
Adhemerval Zanella
adhemerval.zanella@linaro.org
Tue Jul 14 15:50:06 GMT 2026
After commit b75ad99d45b, __libc_setup_tls -> _dl_allocate_tls_init copies
the TLS init image with the IFUNC __mempcpy before ARCH_SETUP_IREL resolves
it, so on a multi-arch sparcv9/sparc64 static build the call jumps through an
unrelocated PLT slot and the process dies with SIGILL.
The sparc dl-symbol-redir-ifunc.h only redirected memset. Redirect
memcpy, memmove, mempcpy and __mempcpy to the ultra1 routines as well,
and merge the identical sparc64 and sparc32/sparcv9 copies into a single
sysdeps/sparc file. The redirection is guarded by __sparc_v9__ &&
USE_MULTIARCH so that sparcv8 (leon) and --disable-multi-arch builds,
which have no __*_ultra1 routines, are left untouched.
Checked with elf tests for sparc32 and sparc64 on qemu system.
---
.../multiarch => }/dl-symbol-redir-ifunc.h | 13 +++++++++-
.../sparc64/multiarch/dl-symbol-redir-ifunc.h | 24 -------------------
2 files changed, 12 insertions(+), 25 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
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/dl-symbol-redir-ifunc.h
similarity index 70%
rename from sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h
rename to sysdeps/sparc/dl-symbol-redir-ifunc.h
index ffe1eee87d5..8b90c847f68 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h
+++ b/sysdeps/sparc/dl-symbol-redir-ifunc.h
@@ -1,4 +1,4 @@
-/* Symbol rediretion for loader/static initialization code.
+/* Symbol redirection for loader/static initialization code. SPARC version.
Copyright (C) 2022-2026 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -19,6 +19,17 @@
#ifndef _DL_IFUNC_GENERIC_H
#define _DL_IFUNC_GENERIC_H
+/* The mem* IFUNCs only exist on a multi-arch sparcv9/sparc64 build. */
+#if defined (__sparc_v9__) && defined (USE_MULTIARCH)
+
asm ("memset = __memset_ultra1");
+# ifndef SHARED
+asm ("memcpy = __memcpy_ultra1");
+asm ("memmove = __memmove_ultra1");
+asm ("mempcpy = __mempcpy_ultra1");
+asm ("__mempcpy = __mempcpy_ultra1");
+# endif
+
+#endif
#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
deleted file mode 100644
index ffe1eee87d5..00000000000
--- a/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Symbol rediretion for loader/static initialization code.
- Copyright (C) 2022-2026 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
-
-asm ("memset = __memset_ultra1");
-
-#endif
--
2.43.0
More information about the Libc-alpha
mailing list