Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package glibc for openSUSE:Factory checked in at 2026-09-01 15:46:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/glibc (Old) and /work/SRC/openSUSE:Factory/.glibc.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "glibc" Tue Sep 1 15:46:52 2026 rev:307 rq:1371787 version:2.44 Changes: -------- --- /work/SRC/openSUSE:Factory/glibc/glibc.changes 2026-06-28 21:04:48.622589215 +0200 +++ /work/SRC/openSUSE:Factory/.glibc.new.1265/glibc.changes 2026-09-01 15:47:33.563087544 +0200 @@ -1,0 +2,73 @@ +Tue Aug 18 09:46:17 UTC 2026 - Andreas Schwab <[email protected]> + +- dt-d-rule.patch: Makerules: Make the .dt to .d conversion safe against + concurrent sub-makes +- math-sinh-worst-case-results.patch: math: Fix sinh worst-case results + for |x| > 36.736801 (BZ #34441) +- math-x86-64-tanh-floatn-aliases.patch: Fix x86_64 tanh _FloatN aliases + binding to the FMA variant (BZ #34465) +- elf-honor-skip-ifunc-for-ifunc-relocations.patch: elf: Honour skip_ifunc + for cross-object IFUNC relocations (BZ #34428) + +------------------------------------------------------------------- +Mon Aug 3 15:20:44 UTC 2026 - Andreas Schwab <[email protected]> + +- For the cross-x86_64 flavor also build the -m32 glibc + +------------------------------------------------------------------- +Tue Jul 28 09:21:20 UTC 2026 - Richard Biener <[email protected]> + +- Enable cross-x86_64 + +------------------------------------------------------------------- +Mon Jul 27 06:08:07 UTC 2026 - Andreas Schwab <[email protected]> + +- Update to glibc 2.44 + * System-wide tunables can be applied using /etc/tunables.conf and + running ldconfig + * A new tunable, glibc.elf.thp, is added to map read-only segments with + Transparent Huge Pages (THP) if THP is not disabled in the kernel + * The THP page size in malloc is capped to MAX_THP_PAGESIZE + * Additional optimized and correctly rounded mathematical functions have + been imported from the CORE-MATH project + * Many additional improvements to existing functions have been synchronized + from the CORE-MATH project + * For C++26, the assert macro is now variadic + * The SVID error handling for cosh and sinh was moved to compatibility + symbols + * Static PIE is now supported for arm-*-linux-gnueabi + * On AArch64 targets that support the Guarded Control Stack extension all GCS + operations (including status, write on shadow stack, and push to shadow + stack) are locked after enabling GCS with ENFORCED or OVERRIDE GCS policy + * On AArch64 targets, log, exp, sin, cas, sinh, cosh, asinh, acosh, atanh + single and double precision special cases have been vectorized for SVE and + AdvSIMD, and vector variants of powr have been added + * On RISC-V targets, vector extension optimized variants of memcmp, memccpy, + memchr, memcpy, memmove, stpncpy, strcmp, strchr, strcpy, strncmp, strncpy, + strlen, and strrchr have been added + * On PowerPC, memchr optimized for Power10 has been re-added + * Pre-built ld.so.cache files can be installed with ldconfig + * A new locale has been added: hrx_BR (Hunsrik language spoken in Brazil) + * Although malloc and related functions currently return pointers + aligned to alignof (max_align_t), the documentation now says future + versions of glibc may relax alignment requirements for small allocations + * GLIBC-SA-2026-0013: Potential stack-based buffer clash during tilde + expansion in wordexp (CVE-2026-6791) + * GLIBC-SA-2026-0014: wordexp with WRDE_APPEND may result in an invalid + call to free() (CVE-2026-6368) +- resolv-count-resource-records.patch, resolv-check-hostname.patch, + ldbl-128ibm-ceill-floorl-roundl-truncl.patch, + getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, + nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, + tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, + elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, + tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, + sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, + ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, + fma-shift-ub.patch, struct-reserved-members.patch, + iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, + resolv-sprintrrf-unkown-types.patch, + resolv-sprintrrf-inet-ntop-check.patch, + resolv-sprintrrf-buffer-overreads.patch: Removed + +------------------------------------------------------------------- Old: ---- aarch64-lock-gcs-startup.patch arm-vfp-plt-trampoline.patch elf-strlen-redir-ifunc.patch fma-shift-ub.patch getlogin-utmp-fallback.patch glibc-2.43.tar.xz glibc-2.43.tar.xz.sig ibm139x-pending-char-state.patch iconv-translit-intermediate-errors.patch ldbl-128ibm-ceill-floorl-roundl-truncl.patch malloc-sys-kernel-mm.patch nss-database-for-fork.patch nss-malloc-failure-checks.patch resolv-check-hostname.patch resolv-count-resource-records.patch resolv-sprintrrf-buffer-overreads.patch resolv-sprintrrf-inet-ntop-check.patch resolv-sprintrrf-unkown-types.patch riscv-redir-memcpy-generic.patch scanf-mc-buffer-overflow.patch struct-reserved-members.patch sys-mount-cloexec-flag.patch sys-mount-open-tree-macros.patch tests-aarch64-makefile-deps-bti.patch tst-rseq-linux-7.patch ungetwc-byte-stream.patch New: ---- dt-d-rule.patch elf-honor-skip-ifunc-for-ifunc-relocations.patch glibc-2.44.tar.xz glibc-2.44.tar.xz.sig math-sinh-worst-case-results.patch math-x86-64-tanh-floatn-aliases.patch ----------(Old B)---------- Old: nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, Old: fma-shift-ub.patch, struct-reserved-members.patch, iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, resolv-sprintrrf-unkown-types.patch, Old: tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, Old: ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, fma-shift-ub.patch, struct-reserved-members.patch, iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, Old: ldbl-128ibm-ceill-floorl-roundl-truncl.patch, getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, Old: tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, Old: fma-shift-ub.patch, struct-reserved-members.patch, iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, resolv-sprintrrf-unkown-types.patch, Old:- resolv-count-resource-records.patch, resolv-check-hostname.patch, ldbl-128ibm-ceill-floorl-roundl-truncl.patch, getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, Old: getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, Old: getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, Old: ldbl-128ibm-ceill-floorl-roundl-truncl.patch, getlogin-utmp-fallback.patch, nss-malloc-failure-checks.patch, nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, Old: call to free() (CVE-2026-6368) - resolv-count-resource-records.patch, resolv-check-hostname.patch, ldbl-128ibm-ceill-floorl-roundl-truncl.patch, Old: call to free() (CVE-2026-6368) - resolv-count-resource-records.patch, resolv-check-hostname.patch, ldbl-128ibm-ceill-floorl-roundl-truncl.patch, Old: resolv-sprintrrf-inet-ntop-check.patch, resolv-sprintrrf-buffer-overreads.patch: Removed Old: resolv-sprintrrf-unkown-types.patch, resolv-sprintrrf-inet-ntop-check.patch, resolv-sprintrrf-buffer-overreads.patch: Removed Old: iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, resolv-sprintrrf-unkown-types.patch, resolv-sprintrrf-inet-ntop-check.patch, Old: tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, Old: sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, fma-shift-ub.patch, struct-reserved-members.patch, Old: ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, fma-shift-ub.patch, struct-reserved-members.patch, iconv-translit-intermediate-errors.patch, arm-vfp-plt-trampoline.patch, Old: elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, Old: tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, Old: nss-database-for-fork.patch, malloc-sys-kernel-mm.patch, tests-aarch64-makefile-deps-bti.patch, aarch64-lock-gcs-startup.patch, elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, Old: elf-strlen-redir-ifunc.patch, riscv-redir-memcpy-generic.patch, tst-rseq-linux-7.patch, sys-mount-cloexec-flag.patch, sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, Old: sys-mount-open-tree-macros.patch, ibm139x-pending-char-state.patch, ungetwc-byte-stream.patch, scanf-mc-buffer-overflow.patch, fma-shift-ub.patch, struct-reserved-members.patch, ----------(Old E)---------- ----------(New B)---------- New: - dt-d-rule.patch: Makerules: Make the .dt to .d conversion safe against concurrent sub-makes New: binding to the FMA variant (BZ #34465) - elf-honor-skip-ifunc-for-ifunc-relocations.patch: elf: Honour skip_ifunc for cross-object IFUNC relocations (BZ #34428) New: concurrent sub-makes - math-sinh-worst-case-results.patch: math: Fix sinh worst-case results for |x| > 36.736801 (BZ #34441) New: for |x| > 36.736801 (BZ #34441) - math-x86-64-tanh-floatn-aliases.patch: Fix x86_64 tanh _FloatN aliases binding to the FMA variant (BZ #34465) ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ glibc.spec ++++++ --- /var/tmp/diff_new_pack.4quKxL/_old 2026-09-01 15:47:37.714232368 +0200 +++ /var/tmp/diff_new_pack.4quKxL/_new 2026-09-01 15:47:37.718232507 +0200 @@ -50,6 +50,9 @@ %define cross_arch ppc64le %define cross_cpu powerpc64le %endif +%if "%flavor" == "cross-x86_64" +%define cross_cpu x86_64 +%endif %if 0%{?cross_cpu:1} %define binutils_os %{cross_cpu}-suse-linux @@ -186,10 +189,10 @@ Summary: Standard Shared Libraries (from the GNU C Library) License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0 Group: System/Libraries -Version: 2.43 +Version: 2.44 Release: 0 %if %{without snapshot} -%define git_id f762ccf84f +%define git_id c3a3a9808a %define libversion %version %else %define git_id %(echo %version | sed 's/.*\.g//') @@ -263,6 +266,9 @@ BuildRequires: libidn2-0 BuildRequires: libstdc++-devel BuildRequires: python3-pexpect +%ifarch aarch64 %{ix86} x86_64 ppc64le s390x armv7hl riscv64 +BuildRequires: valgrind +%endif %endif %if %{build_utils} BuildRequires: gd-devel @@ -337,54 +343,14 @@ ### # Patches from upstream ### -# PATCH-FIX-UPSTREAM resolv: Count records correctly (CVE-2026-4437, BZ #34014) -Patch1000: resolv-count-resource-records.patch -# PATCH-FIX-UPSTREAM resolv: Check hostname for validity (CVE-2026-4438, BZ #34015) -Patch1001: resolv-check-hostname.patch -# PATCH-FIX-UPSTREAM Fix ldbl-128ibm ceill, floorl, roundl and truncl zero-sign handling (BZ #33623) -Patch1002: ldbl-128ibm-ceill-floorl-roundl-truncl.patch -# PATCH-FIX-UPSTREAM Linux: In getlogin_r, use utmp fallback only for specific errors -Patch1003: getlogin-utmp-fallback.patch -# PATCH-FIX-UPSTREAM nss: Missing checks in __nss_configure_lookup, __nss_database_get (BZ #28940) -Patch1004: nss-malloc-failure-checks.patch -# PATCH-FIX-UPSTREAM nss: Introduce dedicated struct nss_database_for_fork type -Patch1005: nss-database-for-fork.patch -# PATCH-FIX-UPSTREAM malloc: Avoid accessing /sys/kernel/mm files -Patch1006: malloc-sys-kernel-mm.patch -# PATCH-FIX-UPSTREAM tests: aarch64: fix makefile dependencies for dlopen tests for BTI -Patch1007: tests-aarch64-makefile-deps-bti.patch -# PATCH-FIX-UPSTREAM aarch64: Lock GCS status at startup -Patch1008: aarch64-lock-gcs-startup.patch -# PATCH-FIX-UPSTREAM elf: Use dl-symbol-redir-ifunc.h instead _dl_strlen -Patch1009: elf-strlen-redir-ifunc.patch -# PATCH-FIX-UPSTREAM riscv: Resolve calls to memcpy using memcpy-generic in early startup -Patch1010: riscv-redir-memcpy-generic.patch -# PATCH-FIX-UPSTREAM tests: fix tst-rseq with Linux 7.0 -Patch1011: tst-rseq-linux-7.patch -# PATCH-FIX-UPSTREAM include: isolate __O_CLOEXEC flag for sys/mount.h and fcntl.h -Patch1012: sys-mount-cloexec-flag.patch -# PATCH-FIX-UPSTREAM Linux: Only define OPEN_TREE_* macros in <sys/mount.h> if undefined (BZ #33921) -Patch1013: sys-mount-open-tree-macros.patch -# PATCH-FIX-UPSTREAM Use pending character state in IBM1390, IBM1399 character sets (CVE-2026-4046, BZ #33980) -Patch1014: ibm139x-pending-char-state.patch -# PATCH-FIX-UPSTREAM libio: Fix ungetwc operating on byte stream (CVE-2026-5928, BZ #33998) -Patch1015: ungetwc-byte-stream.patch -# PATCH-FIX-UPSTREAM stdio-common: Fix buffer overflow in scanf %mc (CVE-2026-5450, BZ #34008) -Patch1016: scanf-mc-buffer-overflow.patch -# PATCH-FIX-UPSTREAM math: Fix fma alignment when exponent difference is exactly 64 (BZ #34183) -Patch1017: fma-shift-ub.patch -# PATCH-FIX-UPSTREAM Rename __unused fields to __glibc_reserved -Patch1018: struct-reserved-members.patch -# PATCH-FIX-UPSTREAM iconv: Suppress intermediate errors with //TRANSLIT (BZ #34236) -Patch1019: iconv-translit-intermediate-errors.patch -# PATCH-FIX-UPSTREAM arm: Save/restore VFP registers in PLT trampolines (BZ #34144, BZ #15792) -Patch1020: arm-vfp-plt-trampoline.patch -# PATCH-FIX-UPSTREAM resolv: More types as unknown in ns_sprintrrf (CVE-2026-5435, BZ #34033) -Patch1021: resolv-sprintrrf-unkown-types.patch -# PATCH-FIX-UPSTREAM resolv: Check for inet_ntop failure in ns_sprintrrf -Patch1022: resolv-sprintrrf-inet-ntop-check.patch -# PATCH-FIX-UPSTREAM resolv: Fix buffer overreads in ns_sprintrrf (CVE-2026-6238, BZ #34069) -Patch1023: resolv-sprintrrf-buffer-overreads.patch +# PATCH-FIX-UPSTREAM Makerules: Make the .dt to .d conversion safe against concurrent sub-makes +Patch1000: dt-d-rule.patch +# PATCH-FIX-UPSTREAM math: Fix sinh worst-case results for |x| > 36.736801 (BZ #34441) +Patch1001: math-sinh-worst-case-results.patch +# PATCH-FIX-UPSTREAM math: Fix x86_64 tanh _FloatN aliases binding to the FMA variant (BZ #34465) +Patch1002: math-x86-64-tanh-floatn-aliases.patch +# PATCH-FIX-UPSTREAM elf: Honour skip_ifunc for cross-object IFUNC relocations (BZ #34428) +Patch1003: elf-honor-skip-ifunc-for-ifunc-relocations.patch %endif ### @@ -858,6 +824,24 @@ cd .. +%if "%flavor" == "cross-x86_64" +mkdir cc-x86 +cd cc-x86 +../configure \ + CFLAGS="$BuildFlags" BUILD_CFLAGS="$BuildFlags" \ + CC="$BuildCC -m32" CXX="$BuildCCplus -m32" \ + --prefix=%{_prefix} \ + --libexecdir=%{_libexecdir} --infodir=%{_infodir} \ + --disable-profile \ + --build=%{build} --host=i586-suse-linux \ + --with-headers=%{sysroot}/usr/include \ + --disable-crypt \ + --disable-build-nscd \ + --disable-nscd +make %{?_smp_mflags} %{?make_output_sync} +cd .. +%endif + # # Build html documentation # @@ -1219,6 +1203,11 @@ export STRIP_KEEP_SYMTAB=*.so* export NO_BRP_STRIP_DEBUG=true make %{?_smp_mflags} install_root=%{buildroot}/%{sysroot} install -C cc-base +%if "%flavor" == "cross-x86_64" +make %{?_smp_mflags} install_root=%{buildroot}/%{sysroot} install -C cc-x86 +rm -rf %{buildroot}/%{sysroot}%{_prefix}/lib/audit +rm -rf %{buildroot}/%{sysroot}%{_prefix}/lib/gconv +%endif rm -rf %{buildroot}/%{sysroot}/%{_libdir}/audit rm -rf %{buildroot}/%{sysroot}/%{_libdir}/gconv rm -rf %{buildroot}/%{sysroot}/%{_infodir} @@ -1226,6 +1215,7 @@ rm -rf %{buildroot}/%{sysroot}/%{_libexecdir} rm -rf %{buildroot}/%{sysroot}/%{_bindir} rm -rf %{buildroot}/%{sysroot}/%{_sbindir} +rm -rf %{buildroot}/%{sysroot}/%{rootsbindir} rm -rf %{buildroot}/%{sysroot}/etc rm -rf %{buildroot}/%{sysroot}/var ++++++ _multibuild ++++++ --- /var/tmp/diff_new_pack.4quKxL/_old 2026-09-01 15:47:37.840236764 +0200 +++ /var/tmp/diff_new_pack.4quKxL/_new 2026-09-01 15:47:37.854237252 +0200 @@ -8,5 +8,6 @@ <package>cross-ppc64le</package> <package>cross-riscv64</package> <package>cross-s390x</package> + <package>cross-x86_64</package> </multibuild> ++++++ dt-d-rule.patch ++++++ >From fc3641194619c7c327ef398c88c07b3069878ed3 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella <[email protected]> Date: Thu, 6 Aug 2026 14:07:58 -0300 Subject: [PATCH] Makerules: Make the .dt to .d conversion safe against concurrent sub-makes The %.d: %.dt rule seds its input into a fixed temporary name, renames it into place and removes the input. Two makes converting the same file trip over each other: mv: cannot stat '.../test-double-libmvec-sincos-avx512f.o.T': No such file or directory sed: can't read .../test-float-libmvec-acosf-avx512f.o.dt: No such file or directory That happens because the elf rtld-Rules recursion runs a sub-make over every $(rtld-subdirs) directory, which converts that directory's .dt files, and the parallel subdirectory recursion (commit 7cac99621e96) runs it concurrently with those subdirectories' own sub-makes. Add the PID of the shell to the temporary name and claim the input with a rename: only the run that wins converts and installs the target. Reviewed-by: Sam James <[email protected]> (cherry picked from commit ba8c8801be7674cc12406914184516a811ac22a8) --- Makerules | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Makerules b/Makerules index 5f65f3ab9e..be51154bae 100644 --- a/Makerules +++ b/Makerules @@ -758,10 +758,20 @@ all-dt-files := $(foreach o,$(object-suffixes-for-libc),$(+depfiles:.d=$o.dt)) $(wildcard $(all-dt-files:.dt=.d)) # This is a funny rule in that it removes its input file. +# +# More than one make can convert the .dt files of a single object +# directory: the elf rtld-Rules recursion runs a sub-make over every +# $(rtld-subdirs) directory, concurrently with that directory's own +# sub-make under the parallel subdir recursion. Add the PID of the +# shell to the temporary name and claim the input with a rename: only +# the run that wins converts and installs the target. %.d: %.dt - @sed $(sed-remove-objpfx) $< > $(@:.d=.T) && \ - mv -f $(@:.d=.T) $@ && \ - rm -f $< + @dt=$(@:.d=.T)$$$$; \ + if mv -f $< $$dt 2>/dev/null; then \ + sed $(sed-remove-objpfx) $$dt > $$dt.new && \ + mv -f $$dt.new $@ && \ + rm -f $$dt; \ + fi # Avoid the .h.d files for any .sym files whose .h files don't exist yet. # They will be generated when they're needed, and trying too early won't work. @@ -1433,7 +1443,7 @@ endef # Also remove the dependencies and generated source files. common-clean: common-mostlyclean -rm -f $(addprefix $(objpfx),$(generated)) - -rm -f $(objpfx)*.d $(objpfx)*.dt + -rm -f $(objpfx)*.d $(objpfx)*.dt $(objpfx)*.T[0-9]* -rm -fr $(addprefix $(objpfx),$(generated-dirs)) -rm -f $(addprefix $(common-objpfx),$(common-generated)) -rm -f $(gen-as-const-headers:%.sym=$(common-objpfx)%.h) -- 2.55.0 ++++++ elf-honor-skip-ifunc-for-ifunc-relocations.patch ++++++ >From 16be1518495f1fa05481b0182c4e4c24927c62df Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella <[email protected]> Date: Mon, 3 Aug 2026 11:02:53 -0300 Subject: [PATCH] elf: Honour skip_ifunc for cross-object IFUNC relocations [BZ #34428] Commit 63b31c05a8a ("elf: Defer all IRELATIVE relocations until after PLT setup") dropped the skip_ifunc argument from elf_dynamic_do_Rel, assuming the new deferred elf_dynamic_do_Rel_irelative pass handles every relocation that may run an IFUNC resolver. That only holds for IFUNC symbols defined in the object being relocated: a reference to an IFUNC in another object is an ordinary JMP_SLOT or GLOB_DAT against an undefined symbol, and its IFUNC nature is only known after symbol resolution inside elf_machine_rel. Those relocations stay in the regular pass, which no longer propagated skip_ifunc, so __RTLD_NOIFUNC was ignored for them. ldd -u forces non-lazy binding (GLRO(dl_lazy) = 0 for DL_DEBUG_UNUSED), so the resolver was called and the diagnostic emitted: $ ldd -u /bin/ls /bin/ls: Relink `' with `/usr/lib64/libc.so.6' for IFUNC symbol `__mempcpy_chk' ldd -r with LD_BIND_NOW is affected in the same way. Restore the skip_ifunc parameter and thread it through _ELF_DYNAMIC_DO_RELOC. This new semantic shows that ELF_DYNAMIC_RELOCATE_NOIFUNC naming is misleading (it reads as "do not process IFUNC", yet it takes a skip_ifunc argument). Replace it to: DL_RELOC_BOTH -> DL_RELOC_ALL DL_RELOC_NOIFUNC -> DL_RELOC_NORMAL DL_RELOC_IFUNC -> DL_RELOC_IRELATIVE ELF_DYNAMIC_RELOCATE_NOIFUNC and ELF_DYNAMIC_RELOCATE_IFUNC become a single ELF_DYNAMIC_RELOCATE_PASS taking the pass as its first argument, and ELF_DYNAMIC_DO_REL/ELF_DYNAMIC_DO_RELA take the pass instead of having three near-identical variants each. Checked on x86_64-linux-gnu, and built for all supported architectures. Reviewed-by: Sam James <[email protected]> (cherry picked from commit 2f2e9bae4093e1c3ba61250e340d3c3b99788f68) --- elf/Makefile | 28 ++++++++ elf/dl-reloc-static-pie.c | 4 +- elf/dl-reloc.c | 6 +- elf/do-rel.h | 24 ++++--- elf/dynamic-link.h | 109 +++++++++++++----------------- elf/tst-ifunc-fault-dep-bindnow.c | 19 ++++++ elf/tst-ifunc-fault-dep-lazy.c | 27 ++++++++ elf/tst-ifunc-fault-mod.c | 38 +++++++++++ 8 files changed, 182 insertions(+), 73 deletions(-) create mode 100644 elf/tst-ifunc-fault-dep-bindnow.c create mode 100644 elf/tst-ifunc-fault-dep-lazy.c create mode 100644 elf/tst-ifunc-fault-mod.c diff --git a/elf/Makefile b/elf/Makefile index 8b063e1bba..d279a5135c 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1396,6 +1396,13 @@ modules-names += \ tst-ifunc-tls-write-lib \ tst-tls-tdata-reloc-lib \ # modules-names +ifeq (yes,$(have-gcc-ifunc)) +tests += \ + tst-ifunc-fault-dep-bindnow \ + tst-ifunc-fault-dep-lazy \ + # tests +modules-names += tst-ifunc-fault-mod +endif ifneq (no,$(have-test-mtls-descriptor)) tests += tst-ifunc-tls-init-tlsdesc modules-names += tst-ifunc-tls-init-tlsdesc-lib @@ -2547,6 +2554,27 @@ $(objpfx)tst-ifunc-fault-bindnow.out: $(objpfx)tst-ifunc-fault-bindnow \ $(objpfx)ld.so $(tst-ifunc-fault-script) +LDFLAGS-tst-ifunc-fault-dep-lazy = -Wl,-z,lazy +LDFLAGS-tst-ifunc-fault-dep-bindnow = -Wl,-z,now +define tst-ifunc-fault-dep-script +( $(test-wrapper) $(rtld-prefix) --verify $< \ + && $(test-wrapper-env) LD_TRACE_LOADED_OBJECTS=1 $(rtld-prefix) $< \ + && $(test-wrapper-env) LD_TRACE_LOADED_OBJECTS=1 LD_DEBUG=unused \ + $(rtld-prefix) $< \ + && $(test-wrapper-env) LD_TRACE_LOADED_OBJECTS=1 LD_WARN=yes LD_BIND_NOW=1 \ + $(rtld-prefix) $< \ +) > $@; $(evaluate-test) +endef +$(objpfx)tst-ifunc-fault-dep-lazy: $(objpfx)tst-ifunc-fault-mod.so +$(objpfx)tst-ifunc-fault-dep-bindnow: $(objpfx)tst-ifunc-fault-mod.so +$(objpfx)tst-ifunc-fault-dep-lazy.out: $(objpfx)tst-ifunc-fault-dep-lazy \ + $(objpfx)tst-ifunc-fault-mod.so $(objpfx)ld.so + $(tst-ifunc-fault-dep-script) +$(objpfx)tst-ifunc-fault-dep-bindnow.out: \ + $(objpfx)tst-ifunc-fault-dep-bindnow \ + $(objpfx)tst-ifunc-fault-mod.so $(objpfx)ld.so + $(tst-ifunc-fault-dep-script) + LDFLAGS-tst-ifunc-plt-lib.so = -Wl,-z,lazy tst-ifunc-plt-bindnow-ENV = LD_BIND_NOW=1 diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c index 8463e46147..5dc5a545a8 100644 --- a/elf/dl-reloc-static-pie.c +++ b/elf/dl-reloc-static-pie.c @@ -80,7 +80,7 @@ _dl_relocate_static_pie (void) /* Relocate ourselves so we can do normal function calls and data access using the global offset table. IRELATIVE entries are deferred. */ - ELF_DYNAMIC_RELOCATE_NOIFUNC (main_map, NULL, 0, 0); + ELF_DYNAMIC_RELOCATE_PASS (DL_RELOC_NORMAL, main_map, NULL, 0, 0, 0); /* Initialize _r_debug_extended. */ struct r_debug *r = _dl_debug_initialize (0, LM_ID_BASE); @@ -98,7 +98,7 @@ void _dl_relocate_static_pie_ifunc (void) { struct link_map *main_map = _dl_get_dl_main_map (); - ELF_DYNAMIC_RELOCATE_IFUNC (main_map, NULL, 0, 0); + ELF_DYNAMIC_RELOCATE_PASS (DL_RELOC_IRELATIVE, main_map, NULL, 0, 0, 0); main_map->l_relocated = 1; } #endif diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index 15a6a4cffe..fa2f41ac44 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -278,7 +278,8 @@ _dl_relocate_object_no_relro (struct link_map *l, struct r_scope_elem *scope[], IFUNC resolvers. Without this, a resolver would see the unrelocated initialiser bytes that were placed into the slot by the early _dl_allocate_tls_init. */ - ELF_DYNAMIC_RELOCATE_NOIFUNC (l, scope, lazy, consider_profiling); + ELF_DYNAMIC_RELOCATE_PASS (DL_RELOC_NORMAL, l, scope, lazy, + consider_profiling, skip_ifunc); #ifdef SHARED /* Re-initialise the static TLS slot with the .tdata so the IRELATIVE @@ -291,7 +292,8 @@ _dl_relocate_object_no_relro (struct link_map *l, struct r_scope_elem *scope[], _dl_init_static_tls (l); #endif - ELF_DYNAMIC_RELOCATE_IFUNC (l, scope, lazy, skip_ifunc); + ELF_DYNAMIC_RELOCATE_PASS (DL_RELOC_IRELATIVE, l, scope, lazy, + 0, skip_ifunc); if ((consider_profiling || consider_symbind) && l->l_info[DT_PLTRELSZ] != NULL) diff --git a/elf/do-rel.h b/elf/do-rel.h index 7702244734..c610d12dbe 100644 --- a/elf/do-rel.h +++ b/elf/do-rel.h @@ -79,17 +79,23 @@ elf_dynamic_Rel_audit_symbind (struct link_map *map, /* Perform the relocations in MAP on the running program image as specified by RELTAG, SZTAG. If LAZY is nonzero, this is the first pass on PLT relocations; they should be set up to call _dl_runtime_resolve, rather - than fully resolved now. + than fully resolved now. If SKIP_IFUNC is nonzero no IFUNC resolver is + called; this is required for the trace modes (ldd -u / ldd -r), which + relocate objects. - IRELATIVE entries are always skipped (non-bootstrap); they are handled + IRELATIVE entries and relocations against an STT_GNU_IFUNC symbol defined + in MAP itself are always skipped (non-bootstrap); they are handled separately by elf_dynamic_do_Rel_irelative after all other relocations - for both .rel.dyn and .rel.plt have been processed. */ + for both .rel.dyn and .rel.plt have been processed. Relocations against + an IFUNC symbol defined in *another* object are not deferred, since the + IFUNC symbol is only known after symbol resolution, and the defining object + has already been relocated at this point. */ static inline void __attribute__ ((always_inline)) elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], ElfW(Addr) reladdr, ElfW(Addr) relsize, __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative, - int lazy) + int lazy, int skip_ifunc) { const ElfW(Rel) *relative = (const void *) reladdr; const ElfW(Rel) *r = relative + nrelative; @@ -111,7 +117,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], void *const r_addr_arg = (void *) (l_addr + r->r_offset); const struct r_found_version *rversion = &map->l_versions[ndx]; - elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, 0); + elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, skip_ifunc); } #else /* !RTLD_BOOTSTRAP */ #if !defined DO_RELA || !defined ELF_MACHINE_PLT_REL @@ -126,7 +132,7 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], const ElfW (Sym) *sym = &symtab[ELFW (R_SYM) (r->r_info)]; if (elf_dynamic_is_Rel_irelative (r, sym)) continue; - elf_machine_lazy_rel (map, scope, l_addr, r, 0); + elf_machine_lazy_rel (map, scope, l_addr, r, skip_ifunc); } } else @@ -158,7 +164,8 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], if (elf_dynamic_is_Rel_irelative (r, sym)) continue; - elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, 0); + elf_machine_rel (map, scope, r, sym, rversion, r_addr_arg, + skip_ifunc); elf_dynamic_Rel_audit_symbind (map, scope, r, sym, rversion, r_addr_arg); } @@ -172,7 +179,8 @@ elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[], if (elf_dynamic_is_Rel_irelative (r, sym)) continue; - elf_machine_rel (map, scope, r, sym, NULL, r_addr_arg, 0); + elf_machine_rel (map, scope, r, sym, NULL, r_addr_arg, + skip_ifunc); elf_dynamic_Rel_audit_symbind (map, scope, r, sym, NULL, r_addr_arg); } diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 35141acec4..0130c63feb 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -78,18 +78,23 @@ elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], consumes precisely the very end of the DT_REL*, or DT_JMPREL and DT_REL* are completely separate and there is a gap between them. */ -/* This controls which sub-passes _ELF_DYNAMIC_DO_RELOC runs. Used to - interleave TLS / stack-protector setup between the two passes so IFUNC - resolvers see a fully-initialised TCB. */ -enum elf_dynamic_reloc_phase +/* Selects which relocations a pass processes. Splitting them allows the + caller to interleave TLS / stack-protector setup between the two passes, + so IFUNC resolvers see a fully-initialised TCB. + + This is orthogonal to the skip_ifunc argument, which says whether an IFUNC + resolver may be run at all and is honoured by every pass. In particular + DL_RELOC_NORMAL also runs IFUNC resolvers, for relocations against an + IFUNC symbol defined in another object. */ +enum elf_dynamic_reloc_pass { - DL_RELOC_BOTH = 0, /* Non-IRELATIVE pass then IRELATIVE pass. */ - DL_RELOC_NOIFUNC = 1, /* Non-IRELATIVE pass only. */ - DL_RELOC_IFUNC = 2, /* IRELATIVE pass only. */ + DL_RELOC_ALL = 0, /* Non-IRELATIVE relocations, then IRELATIVE. */ + DL_RELOC_NORMAL = 1, /* Non-IRELATIVE relocations only. */ + DL_RELOC_IRELATIVE = 2, /* IRELATIVE relocations only. */ }; # define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, scope, do_lazy, skip_ifunc, \ - test_rel, phase) \ + test_rel, pass) \ do { \ struct { ElfW(Addr) start, size; \ __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; } \ @@ -136,14 +141,15 @@ enum elf_dynamic_reloc_phase by the linker. */ \ if (!DO_RTLD_BOOTSTRAP) \ { \ - if ((phase) != DL_RELOC_IFUNC) \ + if ((pass) != DL_RELOC_IRELATIVE) \ for (int ranges_index = 0; ranges_index < 2; ++ranges_index) \ elf_dynamic_do_##reloc ((map), scope, \ ranges[ranges_index].start, \ ranges[ranges_index].size, \ ranges[ranges_index].nrelative, \ - ranges[ranges_index].lazy); \ - if ((phase) != DL_RELOC_NOIFUNC) \ + ranges[ranges_index].lazy, \ + skip_ifunc); \ + if ((pass) != DL_RELOC_NORMAL) \ for (int ranges_index = 0; ranges_index < 2; ++ranges_index) \ elf_dynamic_do_##reloc##_irelative ((map), scope, \ ranges[ranges_index].start, \ @@ -158,7 +164,8 @@ enum elf_dynamic_reloc_phase ranges[ranges_index].start, \ ranges[ranges_index].size, \ ranges[ranges_index].nrelative, \ - ranges[ranges_index].lazy); \ + ranges[ranges_index].lazy, \ + skip_ifunc); \ } while (0) # if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA @@ -169,37 +176,21 @@ enum elf_dynamic_reloc_phase # if ! ELF_MACHINE_NO_REL # include "do-rel.h" -# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc) \ - _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, scope, lazy, skip_ifunc, \ - _ELF_CHECK_REL, DL_RELOC_BOTH) -# define ELF_DYNAMIC_DO_REL_NOIFUNC(map, scope, lazy) \ - _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, scope, lazy, 0, \ - _ELF_CHECK_REL, DL_RELOC_NOIFUNC) -# define ELF_DYNAMIC_DO_REL_IFUNCONLY(map, scope, lazy, skip_ifunc) \ +# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc, pass) \ _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, scope, lazy, skip_ifunc, \ - _ELF_CHECK_REL, DL_RELOC_IFUNC) + _ELF_CHECK_REL, pass) # else -# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc) /* Nothing to do. */ -# define ELF_DYNAMIC_DO_REL_NOIFUNC(map, scope, lazy) /* Nothing to do. */ -# define ELF_DYNAMIC_DO_REL_IFUNCONLY(map, scope, lazy, skip_ifunc) /* Nothing. */ +# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc, pass) /* Nothing. */ # endif # if ! ELF_MACHINE_NO_RELA # define DO_RELA # include "do-rel.h" -# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) \ - _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, scope, lazy, skip_ifunc, \ - _ELF_CHECK_REL, DL_RELOC_BOTH) -# define ELF_DYNAMIC_DO_RELA_NOIFUNC(map, scope, lazy) \ - _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, scope, lazy, 0, \ - _ELF_CHECK_REL, DL_RELOC_NOIFUNC) -# define ELF_DYNAMIC_DO_RELA_IFUNCONLY(map, scope, lazy, skip_ifunc) \ +# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc, pass) \ _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, scope, lazy, skip_ifunc, \ - _ELF_CHECK_REL, DL_RELOC_IFUNC) + _ELF_CHECK_REL, pass) # else -# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) /* Nothing to do. */ -# define ELF_DYNAMIC_DO_RELA_NOIFUNC(map, scope, lazy) /* Nothing to do. */ -# define ELF_DYNAMIC_DO_RELA_IFUNCONLY(map, scope, lazy, skip_ifunc) /* Nothing. */ +# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc, pass) /* Nothing. */ # endif # define ELF_DYNAMIC_DO_RELR(map) \ @@ -240,37 +231,33 @@ enum elf_dynamic_reloc_phase # else # define DO_RTLD_BOOTSTRAP 0 # endif -# define ELF_DYNAMIC_RELOCATE(map, scope, lazy, consider_profile, skip_ifunc) \ - do { \ - int edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy), \ - (consider_profile)); \ - if (!is_rtld_link_map (map) || DO_RTLD_BOOTSTRAP) \ - ELF_DYNAMIC_DO_RELR (map); \ - ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc); \ - ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc); \ - ELF_DYNAMIC_AFTER_RELOC ((map), (edr_lazy)); \ - } while (0) +/* Perform one relocation pass over MAP. PASS selects which relocations are + processed. It is orthogonal to SKIP_IFUNC, which suppresses running IFUNC + resolvers in whichever pass is selected. -/* Like ELF_DYNAMIC_RELOCATE but only processes the non-IRELATIVE pass. - The IRELATIVE pass must be completed later via ELF_DYNAMIC_RELOCATE_IFUNC. - Used by the static-pie startup so the TCB and stack-protector canary can - be initialised between the two passes. */ -# define ELF_DYNAMIC_RELOCATE_NOIFUNC(map, scope, lazy, consider_profile) \ + Unless PASS is DL_RELOC_IRELATIVE, this also performs the machine-specific + PLT/GOT setup, the DT_RELR relocations, and the ELF_DYNAMIC_AFTER_RELOC + hook. */ +# define ELF_DYNAMIC_RELOCATE_PASS(pass, map, scope, lazy, consider_profile, \ + skip_ifunc) \ do { \ - int edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy), \ + int edr_lazy = (lazy); \ + if ((pass) != DL_RELOC_IRELATIVE) \ + { \ + edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy), \ (consider_profile)); \ - if (!is_rtld_link_map (map) || DO_RTLD_BOOTSTRAP) \ - ELF_DYNAMIC_DO_RELR (map); \ - ELF_DYNAMIC_DO_REL_NOIFUNC ((map), (scope), edr_lazy); \ - ELF_DYNAMIC_DO_RELA_NOIFUNC ((map), (scope), edr_lazy); \ - ELF_DYNAMIC_AFTER_RELOC ((map), (edr_lazy)); \ + if (!is_rtld_link_map (map) || DO_RTLD_BOOTSTRAP) \ + ELF_DYNAMIC_DO_RELR (map); \ + } \ + ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc, (pass)); \ + ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc, (pass)); \ + if ((pass) != DL_RELOC_IRELATIVE) \ + ELF_DYNAMIC_AFTER_RELOC ((map), edr_lazy); \ } while (0) -/* IRELATIVE-only companion to ELF_DYNAMIC_RELOCATE_NOIFUNC. */ -# define ELF_DYNAMIC_RELOCATE_IFUNC(map, scope, lazy, skip_ifunc) \ - do { \ - ELF_DYNAMIC_DO_REL_IFUNCONLY ((map), (scope), (lazy), skip_ifunc); \ - ELF_DYNAMIC_DO_RELA_IFUNCONLY ((map), (scope), (lazy), skip_ifunc); \ - } while (0) +/* Run both passes back to back, for callers with nothing to interleave. */ +# define ELF_DYNAMIC_RELOCATE(map, scope, lazy, consider_profile, skip_ifunc) \ + ELF_DYNAMIC_RELOCATE_PASS (DL_RELOC_ALL, (map), (scope), (lazy), \ + (consider_profile), skip_ifunc) #endif diff --git a/elf/tst-ifunc-fault-dep-bindnow.c b/elf/tst-ifunc-fault-dep-bindnow.c new file mode 100644 index 0000000000..60d97dcaa4 --- /dev/null +++ b/elf/tst-ifunc-fault-dep-bindnow.c @@ -0,0 +1,19 @@ +/* Program calling an IFUNC defined in a dependency. BIND_NOW variant. + Copyright (C) 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/>. */ + +#include "tst-ifunc-fault-dep-lazy.c" diff --git a/elf/tst-ifunc-fault-dep-lazy.c b/elf/tst-ifunc-fault-dep-lazy.c new file mode 100644 index 0000000000..122d33f391 --- /dev/null +++ b/elf/tst-ifunc-fault-dep-lazy.c @@ -0,0 +1,27 @@ +/* Program calling an IFUNC defined in a dependency (BZ 34428). + Copyright (C) 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/>. */ + +extern void magic (void); + +int +main (void) +{ + /* JMP_SLOT relocation against an undefined symbol. */ + magic (); + return 1; +} diff --git a/elf/tst-ifunc-fault-mod.c b/elf/tst-ifunc-fault-mod.c new file mode 100644 index 0000000000..11c21b48ac --- /dev/null +++ b/elf/tst-ifunc-fault-mod.c @@ -0,0 +1,38 @@ +/* Shared object exporting an IFUNC symbol with a resolver which crashes. + Copyright (C) 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/>. */ + +#include <stddef.h> + +static void +implementation (void) +{ + /* Produce a crash, without depending on any relocations. */ + volatile char *volatile p = NULL; + *p = 0; +} + +static __typeof__ (implementation) * +resolver (void) +{ + /* Produce a crash, without depending on any relocations. */ + volatile char *volatile p = NULL; + *p = 0; + return implementation; +} + +void magic (void) __attribute__ ((ifunc ("resolver"))); -- 2.55.0 ++++++ glibc-2.43.tar.xz -> glibc-2.44.tar.xz ++++++ /work/SRC/openSUSE:Factory/glibc/glibc-2.43.tar.xz /work/SRC/openSUSE:Factory/.glibc.new.1265/glibc-2.44.tar.xz differ: char 15, line 1 ++++++ ldconfig-concurrency.patch ++++++ --- /var/tmp/diff_new_pack.4quKxL/_old 2026-09-01 15:47:38.087245381 +0200 +++ /var/tmp/diff_new_pack.4quKxL/_new 2026-09-01 15:47:38.092245556 +0200 @@ -44,11 +44,12 @@ if (fd < 0) goto out_fail; -@@ -1167,5 +1167,6 @@ save_aux_cache (const char *aux_cache_na +@@ -1167,6 +1167,7 @@ save_aux_cache (const char *aux_cache_na out_fail: /* Free allocated memory. */ free (temp_name); +out_fail2: free (file_entries); } + ++++++ math-sinh-worst-case-results.patch ++++++ ++++ 656 lines (skipped) ++++++ math-x86-64-tanh-floatn-aliases.patch ++++++ >From 0b58f5d80d24cf83cfde9d8381aafb11fef0e152 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella <[email protected]> Date: Thu, 30 Jul 2026 08:55:54 -0300 Subject: [PATCH] math: Fix x86_64 tanh _FloatN aliases binding to the FMA variant [BZ 34465] The generic implementation emits libm_alias_double unconditionally, so tanhf32x and tanhf64 bind directly to __tanh_fma. Guard the alias with '#ifndef __tanh' and emit it from the dispatcher, as sin. Also remove the stale __expm1 defines, unused since tanh moved to CORE-MATH. Checked on x86_64-linux-gnu, and with 'qemu-x86_64 -cpu Nehalem'. Reported-by: Michael Brunnbauer <[email protected]> (cherry picked from commit b01abba04a954cbd6b2834c0643a08685a915fe5) --- NEWS | 1 + sysdeps/ieee754/dbl-64/s_tanh.c | 2 ++ sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c | 6 ------ sysdeps/x86_64/fpu/multiarch/s_tanh.c | 5 ++--- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/sysdeps/ieee754/dbl-64/s_tanh.c b/sysdeps/ieee754/dbl-64/s_tanh.c index 2029de8fa5..ef80b9edb6 100644 --- a/sysdeps/ieee754/dbl-64/s_tanh.c +++ b/sysdeps/ieee754/dbl-64/s_tanh.c @@ -283,4 +283,6 @@ __tanh (double x) return as_tanh_database (x, res); return res; } +#ifndef __tanh libm_alias_double (__tanh, tanh) +#endif diff --git a/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c b/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c index 1b808b1227..1e6b33740a 100644 --- a/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c +++ b/sysdeps/x86_64/fpu/multiarch/s_tanh-fma.c @@ -1,10 +1,4 @@ #define __tanh __tanh_fma -#define __expm1 __expm1_fma - -/* NB: __expm1 may be expanded to __expm1_fma in the following - prototypes. */ -extern long double __expm1l (long double); -extern long double __expm1f128 (long double); #define SECTION __attribute__ ((section (".text.fma"))) diff --git a/sysdeps/x86_64/fpu/multiarch/s_tanh.c b/sysdeps/x86_64/fpu/multiarch/s_tanh.c index ec8826f634..9048c977c1 100644 --- a/sysdeps/x86_64/fpu/multiarch/s_tanh.c +++ b/sysdeps/x86_64/fpu/multiarch/s_tanh.c @@ -25,10 +25,9 @@ extern double __redirect_tanh (double); # define SYMBOL_NAME tanh # include "ifunc-fma.h" -libc_ifunc_redirected (__redirect_tanh, tanh, IFUNC_SELECTOR ()); +libc_ifunc_redirected (__redirect_tanh, __tanh, IFUNC_SELECTOR ()); +libm_alias_double (__tanh, tanh) # define __tanh __tanh_sse2 -# undef libm_alias_double -# define libm_alias_double(a, b) #endif #include <sysdeps/ieee754/dbl-64/s_tanh.c> -- 2.55.0 ++++++ ulp-prologue-into-asm-functions.patch ++++++ --- /var/tmp/diff_new_pack.4quKxL/_old 2026-09-01 15:47:38.194249114 +0200 +++ /var/tmp/diff_new_pack.4quKxL/_new 2026-09-01 15:47:38.197249219 +0200 @@ -1,4 +1,4 @@ -From 126de75d927a46d050383431023e7a04f2b2ae42 Mon Sep 17 00:00:00 2001 +From a4b0acf5c85f303aa7c8ebc0f1c9b890b1451320 Mon Sep 17 00:00:00 2001 From: Giuliano Belinassi <[email protected]> Date: Fri, 18 Apr 2025 14:22:49 -0300 Subject: [PATCH] Add Userspace Livepatch prologue into ASM functions @@ -26,12 +26,12 @@ 11 files changed, 205 insertions(+), 20 deletions(-) diff --git a/config.h.in b/config.h.in -index 8b4077f578..fb25193ca8 100644 +index 17bdd30570..5ab8ae6beb 100644 --- a/config.h.in +++ b/config.h.in -@@ -213,6 +213,9 @@ - /* Define to 1 if libpthread actually resides in libc. */ - #define PTHREAD_IN_LIBC 0 +@@ -219,6 +219,9 @@ + /* Define to 1 if libpthread is provided by htl. */ + #define __PTHREAD_HTL 0 +/* Define to 1 if support for userspace livepatching is enabled. */ +#define ENABLE_USERSPACE_LIVEPATCH 0 @@ -40,32 +40,32 @@ #define TIMEOUTFACTOR 1 diff --git a/config.make.in b/config.make.in -index fca75ab5d3..7d738ba4fb 100644 +index 0ddc24a589..cac82f740e 100644 --- a/config.make.in +++ b/config.make.in -@@ -82,6 +82,8 @@ mach-interface-list = @mach_interface_list@ - memory-tagging = @memory_tagging@ +@@ -79,6 +79,8 @@ multi-arch = @multi_arch@ + mach-interface-list = @mach_interface_list@ # Configuration options. +enable-userspace-livepatch = @enable_userspace_livepatch@ +supports-msplit-patch-nops = @supports_msplit_patch_nops@ build-shared = @shared@ build-profile = @profile@ - build-static-nss = @static_nss@ + cross-compiling = @cross_compiling@ diff --git a/configure b/configure -index e8de94464c..273ad66484 100755 +index 604279533a..62bb2e6fe2 100755 --- a/configure +++ b/configure -@@ -615,6 +615,8 @@ LIBOBJS - pthread_in_libc +@@ -614,6 +614,8 @@ ac_subst_vars='LTLIBOBJS + LIBOBJS RELEASE VERSION +supports_msplit_patch_nops +enable_userspace_livepatch mach_interface_list DEFINES - static_nss -@@ -825,6 +827,7 @@ enable_scv + profile +@@ -818,6 +820,7 @@ enable_scv enable_fortify_source enable_sframe with_cpu @@ -73,7 +73,7 @@ ' ac_precious_vars='build_alias host_alias -@@ -1510,6 +1513,8 @@ Optional Features: +@@ -1500,6 +1503,8 @@ Optional Features: hardening, defaults to highest possible value supported by the build compiler. --enable-sframe Enable building with SFrame support [default=no] @@ -82,7 +82,7 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] -@@ -9498,6 +9503,55 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` +@@ -9577,6 +9582,55 @@ libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` @@ -139,10 +139,10 @@ RELEASE=`sed -n -e 's/^#define RELEASE "\([^"]*\)"/\1/p' < $srcdir/version.h` diff --git a/configure.ac b/configure.ac -index fc01d054ba..c1d4952066 100644 +index 2fe7980fc9..552e61853e 100644 --- a/configure.ac +++ b/configure.ac -@@ -2178,6 +2178,35 @@ AC_SUBST(DEFINES) +@@ -2193,6 +2193,35 @@ AC_SUBST(DEFINES) dnl See sysdeps/mach/configure.ac for this variable. AC_SUBST(mach_interface_list) @@ -195,7 +195,7 @@ # passed to all such object files. type-float128-CFLAGS := -mfloat128 diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h -index f05dae71f6..55c6b9b45b 100644 +index 26cccbf269..6ce22bc8d5 100644 --- a/sysdeps/powerpc/powerpc64/sysdep.h +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -163,6 +163,46 @@ @@ -277,7 +277,7 @@ #define ENTRY(name, ...) \ ENTRY_TOCLESS(name, ## __VA_ARGS__) diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile -index c3e1065c81..4b52dbff81 100644 +index ff0463d7ca..3d81acbcfa 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -1,3 +1,8 @@ @@ -290,7 +290,7 @@ long-double-fcts = yes diff --git a/sysdeps/x86_64/multiarch/strcmp-avx2.S b/sysdeps/x86_64/multiarch/strcmp-avx2.S -index 4b46a8de17..8266f558d9 100644 +index 3b43dc2e00..a66029cb88 100644 --- a/sysdeps/x86_64/multiarch/strcmp-avx2.S +++ b/sysdeps/x86_64/multiarch/strcmp-avx2.S @@ -201,10 +201,7 @@ END (STRCASECMP) @@ -306,7 +306,7 @@ # if defined USE_AS_STRCASECMP_L /* We have to fall back on the C implementation for locales with diff --git a/sysdeps/x86_64/multiarch/strcmp-evex.S b/sysdeps/x86_64/multiarch/strcmp-evex.S -index 6316bb940e..91192f2d2e 100644 +index d87d33cc64..5cd52f3e37 100644 --- a/sysdeps/x86_64/multiarch/strcmp-evex.S +++ b/sysdeps/x86_64/multiarch/strcmp-evex.S @@ -226,10 +226,7 @@ END (STRCASECMP) @@ -322,7 +322,7 @@ # if defined USE_AS_STRCASECMP_L /* We have to fall back on the C implementation for locales with diff --git a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S -index 1b746c4b2f..01c8eb44e3 100644 +index c0d7210404..720e5e4bf3 100644 --- a/sysdeps/x86_64/multiarch/strcmp-sse4_2.S +++ b/sysdeps/x86_64/multiarch/strcmp-sse4_2.S @@ -103,10 +103,7 @@ END (STRCASECMP) @@ -338,7 +338,7 @@ /* * This implementation uses SSE to compare up to 16 bytes at a time. diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h -index cb475bec98..2bb84c4c31 100644 +index f71f49213f..dee7ec0f90 100644 --- a/sysdeps/x86_64/sysdep.h +++ b/sysdeps/x86_64/sysdep.h @@ -49,6 +49,46 @@ enum cf_protection_level @@ -415,6 +415,6 @@ /* This macro is for setting proper CFI with DW_CFA_expression describing the register as saved relative to %rsp instead of relative to the CFA. -- -2.50.1 +2.55.0
