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
 
 

Reply via email to