diff -ruN a/Makeconfig b/Makeconfig --- a/Makeconfig 2026-01-23 14:54:00.000000000 -0600 +++ b/Makeconfig 2026-03-15 19:54:42.332792487 -0500 @@ -714,33 +714,109 @@ else libunwind = -lunwind endif -libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed +# Preserve the configured target selection when asking the compiler for +# support libraries and CRT objects. For Clang, prefer +# compiler-rt builtins if available because libgcc lookups may resolve to a +# host archive. +cc-runtime-flags := $(filter-out -I%,$(CFLAGS)) $(sysdep-LDFLAGS) $(LDFLAGS) +cc-runtime-target := $(shell $(CC) $(cc-runtime-flags) -print-target-triple 2>/dev/null) +cc-clang-resource-dir := $(shell $(CC) $(cc-runtime-flags) --print-resource-dir 2>/dev/null) +cc-clang-rtlib-flags := $(shell \ + if test "$(have-test-clang)" = yes; then \ + for candidate in i686-linux-gnu i686-unknown-linux-gnu i386-unknown-linux-gnu "$(cc-runtime-target)"; do \ + if test -n "$$candidate"; then \ + rtlib=$$($(CC) $(cc-runtime-flags) --target=$$candidate \ + --rtlib=compiler-rt --print-libgcc-file-name 2>/dev/null); \ + if test "x$$rtlib" != x && test "x$$rtlib" != xlibgcc.a && test -r "$$rtlib"; then \ + printf '%s' "--target=$$candidate --rtlib=compiler-rt"; \ + exit 0; \ + fi; \ + fi; \ + done; \ + fi) +cc-clang-crtbegin := $(shell \ + if test "$(have-test-clang)" = yes; then \ + for path in \ + "$(cc-clang-resource-dir)/lib/i686-linux-gnu/clang_rt.crtbegin-i386.o" \ + "$(cc-clang-resource-dir)/lib/i686-unknown-linux-gnu/clang_rt.crtbegin-i386.o" \ + "$(cc-clang-resource-dir)/lib/i386-unknown-linux-gnu/clang_rt.crtbegin-i386.o" \ + "$(cc-clang-resource-dir)/lib/$(cc-runtime-target)/clang_rt.crtbegin-i386.o" \ + "$(cc-clang-resource-dir)/lib/linux/clang_rt.crtbegin-i386.o"; do \ + if test -r "$$path"; then \ + printf '%s' "$$path"; \ + exit 0; \ + fi; \ + done; \ + fi) +cc-clang-crtend := $(shell \ + if test "$(have-test-clang)" = yes; then \ + for path in \ + "$(cc-clang-resource-dir)/lib/i686-linux-gnu/clang_rt.crtend-i386.o" \ + "$(cc-clang-resource-dir)/lib/i686-unknown-linux-gnu/clang_rt.crtend-i386.o" \ + "$(cc-clang-resource-dir)/lib/i386-unknown-linux-gnu/clang_rt.crtend-i386.o" \ + "$(cc-clang-resource-dir)/lib/$(cc-runtime-target)/clang_rt.crtend-i386.o" \ + "$(cc-clang-resource-dir)/lib/linux/clang_rt.crtend-i386.o"; do \ + if test -r "$$path"; then \ + printf '%s' "$$path"; \ + exit 0; \ + fi; \ + done; \ + fi) +libgcc := $(shell \ + lib=$$($(CC) $(cc-runtime-flags) --print-libgcc-file-name 2>/dev/null); \ + if test "$(have-test-clang)" = yes; then \ + rtlib=$$($(CC) $(cc-runtime-flags) $(cc-clang-rtlib-flags) \ + --print-libgcc-file-name 2>/dev/null); \ + if test "x$$rtlib" != x && test "x$$rtlib" != xlibgcc.a && test -r "$$rtlib"; then \ + lib=$$rtlib; \ + else \ + for path in \ + "$(cc-clang-resource-dir)/lib/i686-linux-gnu/libclang_rt.builtins.a" \ + "$(cc-clang-resource-dir)/lib/i686-unknown-linux-gnu/libclang_rt.builtins.a" \ + "$(cc-clang-resource-dir)/lib/i386-unknown-linux-gnu/libclang_rt.builtins.a" \ + "$(cc-clang-resource-dir)/lib/$(cc-runtime-target)/libclang_rt.builtins.a" \ + "$(cc-clang-resource-dir)/lib/linux/libclang_rt.builtins-i386.a"; do \ + if test -r "$$path"; then \ + lib=$$path; \ + break; \ + fi; \ + done; \ + fi; \ + fi; \ + printf '%s' "$$lib") +# Do not mix Clang's compiler-rt builtins with GCC crtbegin/crtend +# objects. If compiler-rt CRT objects are unavailable, leave these +# empty and let the link proceed without the GCC startup fragments. +cc-clang-use-rt := $(and $(filter yes,$(have-test-clang)),$(cc-clang-rtlib-flags)) +libgcc_eh_archive := $(shell $(CC) $(cc-runtime-flags) --print-file-name=libgcc_eh.a) +libgcc_s := $(shell $(CC) $(cc-runtime-flags) --print-file-name=libgcc_s.so$(libgcc_s.so-version)) +libgcc_eh := -Wl,--as-needed $(libgcc_s) $(libunwind) -Wl,--no-as-needed gnulib-arch = -gnulib = -lgcc $(gnulib-arch) -gnulib-tests := -lgcc $(libgcc_eh) -gnulib-extralibdir = $(dir $(shell $(CC) -print-file-name=libgcc_s.so$(libgcc_s.so-version))) +gnulib = $(libgcc) $(gnulib-arch) +gnulib-tests := $(libgcc) $(libgcc_eh) +gnulib-extralibdir = $(patsubst ./,,$(dir $(libgcc_s))) static-gnulib-arch = # By default, elf/static-stubs.o, instead of -lgcc_eh, is used to # statically link programs. When --disable-shared is used, we use # -lgcc_eh since elf/static-stubs.o isn't sufficient. ifeq (yes,$(build-shared)) -static-gnulib = -lgcc $(static-gnulib-arch) +static-gnulib = $(libgcc) $(static-gnulib-arch) else -static-gnulib = -lgcc -lgcc_eh $(static-gnulib-arch) +static-gnulib = $(libgcc) $(libgcc_eh_archive) $(static-gnulib-arch) endif -static-gnulib-tests := -lgcc -lgcc_eh $(libunwind) -libc.so-gnulib := -lgcc +static-gnulib-tests := $(libgcc) $(libgcc_eh_archive) $(libunwind) +libc.so-gnulib := $(libgcc) endif +preinit = $(addprefix $(csu-objpfx),crti.o) +postinit = $(addprefix $(csu-objpfx),crtn.o) -+prector = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbegin.o` -+postctor = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtend.o` ++prector = $(if $(cc-clang-use-rt),$(cc-clang-crtbegin),`$(CC) $(cc-runtime-flags) --print-file-name=crtbegin.o`) ++postctor = $(if $(cc-clang-use-rt),$(cc-clang-crtend),`$(CC) $(cc-runtime-flags) --print-file-name=crtend.o`) # Variants of the two previous definitions for linking PIE programs. -+prectorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginS.o` -+postctorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtendS.o` ++prectorS = $(if $(cc-clang-use-rt),$(cc-clang-crtbegin),`$(CC) $(cc-runtime-flags) --print-file-name=crtbeginS.o`) ++postctorS = $(if $(cc-clang-use-rt),$(cc-clang-crtend),`$(CC) $(cc-runtime-flags) --print-file-name=crtendS.o`) # Variants of the two previous definitions for statically linking programs. -static-prector = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginT.o` -static-postctor = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtend.o` +static-prector = $(if $(cc-clang-use-rt),$(cc-clang-crtbegin),`$(CC) $(cc-runtime-flags) --print-file-name=crtbeginT.o`) +static-postctor = $(if $(cc-clang-use-rt),$(cc-clang-crtend),`$(CC) $(cc-runtime-flags) --print-file-name=crtend.o`) ifeq (yes,$(enable-static-pie)) # Static PIE must use PIE variants. +prectorT = $(if $($(@F)-no-pie),$(static-prector),$(+prectorS)) diff -ruN a/Makerules b/Makerules --- a/Makerules 2026-01-23 14:54:00.000000000 -0600 +++ b/Makerules 2026-03-15 19:54:16.435354197 -0500 @@ -543,7 +543,7 @@ $(call after-link,$@) define build-shlib-helper -$(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) \ +$(LINK.o) -shared $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-rtlib-flags)),-nostartfiles $(cc-clang-rtlib-flags),-static-libgcc) -Wl,-O1 $(sysdep-LDFLAGS) \ $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) $(rtld-LDFLAGS) \ $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(dt-relr-ldflag)) \ $(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \ @@ -555,11 +555,13 @@ define build-shlib $(build-shlib-helper) -o $@ \ - $(csu-objpfx)abi-note.o $(build-shlib-objlist) + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtbegin)),$(if $(filter c.so,$(@F)),,$(+preinit)) $(+prectorS)) \ + $(csu-objpfx)abi-note.o $(build-shlib-objlist) \ + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtend)),$(+postctorS) $(if $(filter c.so,$(@F)),,$(+postinit))) endef define build-module-helper -$(LINK.o) -shared -static-libgcc $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \ +$(LINK.o) -shared $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-rtlib-flags)),-nostartfiles $(cc-clang-rtlib-flags),-static-libgcc) $(sysdep-LDFLAGS) $(rtld-LDFLAGS) \ $(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) \ $(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(dt-relr-ldflag)) \ -B$(csu-objpfx) $(load-map-file) \ @@ -574,14 +576,18 @@ # not for shared objects define build-module $(build-module-helper) -o $@ \ - $(csu-objpfx)abi-note.o $(build-module-objlist) $(link-libc-args) + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtbegin)),$(+preinit) $(+prectorS)) \ + $(csu-objpfx)abi-note.o $(build-module-objlist) $(link-libc-args) \ + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtend)),$(+postctorS) $(+postinit)) $(call after-link,$@) endef define build-module-asneeded $(build-module-helper) -o $@ \ + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtbegin)),$(+preinit) $(+prectorS)) \ $(csu-objpfx)abi-note.o \ -Wl,--as-needed $(build-module-objlist) -Wl,--no-as-needed \ - $(link-libc-args) + $(link-libc-args) \ + $(if $(and $(filter yes,$(have-test-clang)),$(cc-clang-crtend)),$(+postctorS) $(+postinit)) $(call after-link,$@) endef diff -ruN a/configure b/configure --- a/configure 2026-01-23 14:54:00.000000000 -0600 +++ b/configure 2026-03-15 19:54:16.436079577 -0500 @@ -9328,18 +9328,28 @@ config_vars="$config_vars enable-static-pie = $libc_cv_static_pie" -# Check if we can link support functionality against libgcc_s. +# Check if the compiler reports usable support functionality from libgcc_s. # Must not be used for linking installed binaries, to produce the # same binaries for bootstrapped and bootstrapping builds (the latter # with a GCC that does not build libgcc_s). -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC can link against -lgcc_s" >&5 -printf %s "checking whether $CC can link against -lgcc_s... " >&6; } +# +# The compiler-reported runtime may be an absolute path rather than a bare +# library name, for example when using llvm-libgcc. Include the configured +# target-selection flags so multilib and compiler-rt builds query the +# matching runtime. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC reports a usable libgcc_s" >&5 +printf %s "checking whether $CC reports a usable libgcc_s... " >&6; } if test ${libc_cv_have_libgcc_s+y} then : printf %s "(cached) " >&6 else case e in #( e) old_LIBS="$LIBS" - LIBS="$LIBS -lgcc_s" + libc_cv_libgcc_s=`$CC $CFLAGS $LDFLAGS -print-file-name=libgcc_s.so 2>/dev/null` + if test "x$libc_cv_libgcc_s" = "xlibgcc_s.so" + then : + libc_cv_have_libgcc_s=no + else case e in #( + e) LIBS="$LIBS $libc_cv_libgcc_s" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9360,6 +9370,9 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext + ;; +esac + fi LIBS="$old_LIBS" ;; esac fi @@ -11002,5 +11015,3 @@ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi - - diff -ruN a/configure.ac b/configure.ac --- a/configure.ac 2026-01-23 14:54:00.000000000 -0600 +++ b/configure.ac 2026-03-15 19:54:16.436525491 -0500 @@ -2122,15 +2122,24 @@ fi LIBC_CONFIG_VAR([enable-static-pie], [$libc_cv_static_pie]) -# Check if we can link support functionality against libgcc_s. +# Check if the compiler reports usable support functionality from libgcc_s. # Must not be used for linking installed binaries, to produce the # same binaries for bootstrapped and bootstrapping builds (the latter # with a GCC that does not build libgcc_s). -AC_CACHE_CHECK([whether $CC can link against -lgcc_s], libc_cv_have_libgcc_s, [dnl +# The compiler-reported runtime may be an absolute path rather than a bare +# library name, for example when using llvm-libgcc. Include the configured +# target-selection flags so multilib and compiler-rt builds query the +# matching runtime. +AC_CACHE_CHECK([whether $CC reports a usable libgcc_s], libc_cv_have_libgcc_s, [dnl old_LIBS="$LIBS" - LIBS="$LIBS -lgcc_s" - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], - [libc_cv_have_libgcc_s=yes], [libc_cv_have_libgcc_s=no]) + libc_cv_libgcc_s=`$CC $CFLAGS $LDFLAGS -print-file-name=libgcc_s.so 2>/dev/null` + if test "x$libc_cv_libgcc_s" = "xlibgcc_s.so"; then + libc_cv_have_libgcc_s=no + else + LIBS="$LIBS $libc_cv_libgcc_s" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], + [libc_cv_have_libgcc_s=yes], [libc_cv_have_libgcc_s=no]) + fi LIBS="$old_LIBS"]) LIBC_CONFIG_VAR([have-libgcc_s], [$libc_cv_have_libgcc_s]) diff -ruN a/dlfcn/Makefile b/dlfcn/Makefile --- a/dlfcn/Makefile 2026-01-23 14:54:00.000000000 -0600 +++ b/dlfcn/Makefile 2026-03-15 19:54:16.436660818 -0500 @@ -187,7 +187,7 @@ $(objpfx)bug-atexit2.out: $(objpfx)bug-atexit2-lib.so ifneq (,$(CXX)) -LDLIBS-bug-atexit3-lib.so = -lstdc++ -lgcc_eh +LDLIBS-bug-atexit3-lib.so = -lstdc++ $(libgcc_eh_archive) $(objpfx)bug-atexit3-lib.so: $(libsupport) $(objpfx)bug-atexit3.out: $(objpfx)bug-atexit3-lib.so endif diff -ruN a/elf/Makefile b/elf/Makefile --- a/elf/Makefile 2026-01-23 14:54:00.000000000 -0600 +++ b/elf/Makefile 2026-03-15 19:54:16.436784483 -0500 @@ -1514,7 +1514,7 @@ echo ".globl $$symbol"; \ echo "$$symbol:"; \ done | $(CC) -o $@T.o $(ASFLAGS) -c -x assembler - - $(reloc-link) -o $@.o $@T.o '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@T + $(reloc-link) -o $@.o $@T.o '-Wl,-(' $^ $(libgcc) '-Wl,-)' -Wl,-Map,$@T rm -f %@T.o $@.o mv -f $@T $@ @@ -1544,7 +1544,7 @@ $(MAKE) -f $< -f rtld-Rules $(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(objpfx)rtld-libc.a - $(LINK.o) -nostdlib -nostartfiles -r -o $@ '-Wl,-(' $^ -lgcc '-Wl,-)' \ + $(LINK.o) -nostdlib -nostartfiles -r -o $@ '-Wl,-(' $^ $(libgcc) '-Wl,-)' \ -Wl,-Map,$@.map generated += librtld.map librtld.mk rtld-libc.a librtld.os.map diff -ruN a/support/Makefile b/support/Makefile --- a/support/Makefile 2026-01-23 14:54:00.000000000 -0600 +++ b/support/Makefile 2026-03-15 19:54:16.436940579 -0500 @@ -284,14 +284,14 @@ ifeq (,$(CXX)) LINKS_DSO_PROGRAM = links-dso-program-c -LDLIBS-links-dso-program-c = -lgcc +LDLIBS-links-dso-program-c = $(libgcc) ifeq ($(have-libgcc_s),yes) CFLAGS-links-dso-program-c.c += -fexceptions -LDLIBS-links-dso-program-c += -lgcc_s $(libunwind) +LDLIBS-links-dso-program-c += $(libgcc_s) $(libunwind) endif else LINKS_DSO_PROGRAM = links-dso-program -LDLIBS-links-dso-program = -lstdc++ -lgcc -lgcc_s $(libunwind) +LDLIBS-links-dso-program = -lstdc++ $(libgcc) $(libgcc_s) $(libunwind) endif ifeq (yes,$(have-selinux))