diff -urN a/Makefile.tool.am b/Makefile.tool.am --- a/Makefile.tool.am 2025-10-24 13:43:21.000000000 -0500 +++ b/Makefile.tool.am 2026-03-22 13:02:33.492002899 -0500 @@ -16,7 +16,9 @@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a endif -TOOL_LDADD_COMMON = -lgcc +# Ask the compiler driver for its runtime support archive at link time so +# clang can use compiler-rt instead of a hardcoded GNU libgcc. +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) $(TOOL_LDADD_COMMON) if VGCONF_HAVE_PLATFORM_SEC @@ -290,4 +292,3 @@ install-exec-local: install-noinst_PROGRAMS install-noinst_DSYMS uninstall-local: uninstall-noinst_PROGRAMS uninstall-noinst_DSYMS - diff -urN a/cachegrind/Makefile.in b/cachegrind/Makefile.in --- a/cachegrind/Makefile.in 2025-10-24 13:43:44.000000000 -0500 +++ b/cachegrind/Makefile.in 2026-03-22 12:59:22.464512205 -0500 @@ -742,7 +742,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/callgrind/Makefile.in b/callgrind/Makefile.in --- a/callgrind/Makefile.in 2025-10-24 13:43:45.000000000 -0500 +++ b/callgrind/Makefile.in 2026-03-22 12:59:22.464050754 -0500 @@ -789,7 +789,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/coregrind/link_tool_exe_freebsd.in b/coregrind/link_tool_exe_freebsd.in --- a/coregrind/link_tool_exe_freebsd.in 2025-10-24 13:43:21.000000000 -0500 +++ b/coregrind/link_tool_exe_freebsd.in 2026-03-22 12:59:22.464512205 -0500 @@ -56,6 +56,84 @@ use warnings; use strict; +sub capture_command_output { + my (@cmd) = @_; + my $pid = open(my $fh, "-|"); + die "Can't fork: $!" if !defined $pid; + + if ($pid == 0) { + open(STDERR, ">", "/dev/null") + or die "Can't redirect stderr: $!"; + exec @cmd or die "Can't exec @cmd: $!"; + } + + local $/ = undef; + my $output = <$fh>; + close($fh); + + return defined $output ? $output : ""; +} + +sub compiler_cmd_prefix { + my (@args) = @_; + my @prefix = (); + + foreach my $arg (@args) { + last if $arg =~ /^-/; + last if $arg =~ /\.(?:a|o|c|cc|cpp|cxx|s|S)$/; + push @prefix, $arg; + } + + die "Can't determine compiler command" + if scalar(@prefix) == 0; + + return @prefix; +} + +sub compiler_runtime_probe_args { + my (@args) = @_; + my @probe_args = (); + + for (my $n = 0; $n <= $#args; $n++) { + my $arg = $args[$n]; + + if ($arg eq "-m32" || $arg eq "-m64") { + push @probe_args, $arg; + next; + } + + if ($arg eq "-B" || $arg eq "--sysroot" || $arg eq "-resource-dir" + || $arg eq "-target" || $arg eq "--target" + || $arg eq "--gcc-toolchain") { + last if $n == $#args; + push @probe_args, $arg, $args[++$n]; + next; + } + + if ($arg =~ /^(-B|--sysroot=|-resource-dir=|-target=|--target=|--gcc-toolchain=|--rtlib=|-rtlib=|-stdlib=|-fuse-ld=)/) { + push @probe_args, $arg; + next; + } + } + + return @probe_args; +} + +sub compiler_runtime_archive { + my (@args) = @_; + my @compiler = compiler_cmd_prefix(@args); + my @probe_args = compiler_runtime_probe_args(@args); + + foreach my $probe ("-print-libgcc-file-name", "-print-file-name=libgcc.a") { + my $path = capture_command_output(@compiler, @probe_args, $probe); + chomp $path; + next if $path eq "" || $path eq "libgcc.a"; + return $path if -f $path; + } + + return "-lgcc"; +} + # expect at least: alt-load-address gcc -o foo bar.o die "Not enough arguments" if (($#ARGV + 1) < 5); @@ -67,7 +145,9 @@ die "Bogus alt-load address" if (length($ala) < 3 || index($ala, "0x") != 0); -my $cmd = join(" ", @ARGV, "-static -Wl,@FLAG_T_TEXT@=$ala"); +my $compiler_runtime = compiler_runtime_archive(@ARGV); + +my $cmd = join(" ", @ARGV, $compiler_runtime, "-static -Wl,@FLAG_T_TEXT@=$ala"); #print "link_tool_exe_freebsd: $cmd\n"; diff -urN a/coregrind/link_tool_exe_linux.in b/coregrind/link_tool_exe_linux.in --- a/coregrind/link_tool_exe_linux.in 2025-10-24 13:43:21.000000000 -0500 +++ b/coregrind/link_tool_exe_linux.in 2026-03-22 12:59:22.464512205 -0500 @@ -58,6 +58,84 @@ use warnings; use strict; +sub capture_command_output { + my (@cmd) = @_; + my $pid = open(my $fh, "-|"); + die "Can't fork: $!" if !defined $pid; + + if ($pid == 0) { + open(STDERR, ">", "/dev/null") + or die "Can't redirect stderr: $!"; + exec @cmd or die "Can't exec @cmd: $!"; + } + + local $/ = undef; + my $output = <$fh>; + close($fh); + + return defined $output ? $output : ""; +} + +sub compiler_cmd_prefix { + my (@args) = @_; + my @prefix = (); + + foreach my $arg (@args) { + last if $arg =~ /^-/; + last if $arg =~ /\.(?:a|o|c|cc|cpp|cxx|s|S)$/; + push @prefix, $arg; + } + + die "Can't determine compiler command" + if scalar(@prefix) == 0; + + return @prefix; +} + +sub compiler_runtime_probe_args { + my (@args) = @_; + my @probe_args = (); + + for (my $n = 0; $n <= $#args; $n++) { + my $arg = $args[$n]; + + if ($arg eq "-m32" || $arg eq "-m64") { + push @probe_args, $arg; + next; + } + + if ($arg eq "-B" || $arg eq "--sysroot" || $arg eq "-resource-dir" + || $arg eq "-target" || $arg eq "--target" + || $arg eq "--gcc-toolchain") { + last if $n == $#args; + push @probe_args, $arg, $args[++$n]; + next; + } + + if ($arg =~ /^(-B|--sysroot=|-resource-dir=|-target=|--target=|--gcc-toolchain=|--rtlib=|-rtlib=|-stdlib=|-fuse-ld=)/) { + push @probe_args, $arg; + next; + } + } + + return @probe_args; +} + +sub compiler_runtime_archive { + my (@args) = @_; + my @compiler = compiler_cmd_prefix(@args); + my @probe_args = compiler_runtime_probe_args(@args); + + foreach my $probe ("-print-libgcc-file-name", "-print-file-name=libgcc.a") { + my $path = capture_command_output(@compiler, @probe_args, $probe); + chomp $path; + next if $path eq "" || $path eq "libgcc.a"; + return $path if -f $path; + } + + return "-lgcc"; +} + # expect at least: alt-load-address gcc -o foo bar.o die "Not enough arguments" if (($#ARGV + 1) < 5); @@ -69,7 +147,9 @@ die "Bogus alt-load address" if (length($ala) < 3 || index($ala, "0x") != 0); -my $cmd = join(" ", @ARGV, "-static -Wl,@FLAG_T_TEXT@=$ala"); +my $compiler_runtime = compiler_runtime_archive(@ARGV); + +my $cmd = join(" ", @ARGV, $compiler_runtime, "-static -Wl,@FLAG_T_TEXT@=$ala"); #print "link_tool_exe_linux: $cmd\n"; diff -urN a/coregrind/link_tool_exe_solaris.in b/coregrind/link_tool_exe_solaris.in --- a/coregrind/link_tool_exe_solaris.in 2025-10-24 13:43:21.000000000 -0500 +++ b/coregrind/link_tool_exe_solaris.in 2026-03-22 12:59:22.464512205 -0500 @@ -21,6 +21,84 @@ use File::Temp qw/tempfile unlink0/; use Fcntl qw/F_SETFD/; +sub capture_command_output { + my (@cmd) = @_; + my $pid = open(my $fh, "-|"); + die "Can't fork: $!" if !defined $pid; + + if ($pid == 0) { + open(STDERR, ">", "/dev/null") + or die "Can't redirect stderr: $!"; + exec @cmd or die "Can't exec @cmd: $!"; + } + + local $/ = undef; + my $output = <$fh>; + close($fh); + + return defined $output ? $output : ""; +} + +sub compiler_cmd_prefix { + my (@args) = @_; + my @prefix = (); + + foreach my $arg (@args) { + last if $arg =~ /^-/; + last if $arg =~ /\.(?:a|o|c|cc|cpp|cxx|s|S)$/; + push @prefix, $arg; + } + + die "Can't determine compiler command" + if scalar(@prefix) == 0; + + return @prefix; +} + +sub compiler_runtime_probe_args { + my (@args) = @_; + my @probe_args = (); + + for (my $n = 0; $n <= $#args; $n++) { + my $arg = $args[$n]; + + if ($arg eq "-m32" || $arg eq "-m64") { + push @probe_args, $arg; + next; + } + + if ($arg eq "-B" || $arg eq "--sysroot" || $arg eq "-resource-dir" + || $arg eq "-target" || $arg eq "--target" + || $arg eq "--gcc-toolchain") { + last if $n == $#args; + push @probe_args, $arg, $args[++$n]; + next; + } + + if ($arg =~ /^(-B|--sysroot=|-resource-dir=|-target=|--target=|--gcc-toolchain=|--rtlib=|-rtlib=|-stdlib=|-fuse-ld=)/) { + push @probe_args, $arg; + next; + } + } + + return @probe_args; +} + +sub compiler_runtime_archive { + my (@args) = @_; + my @compiler = compiler_cmd_prefix(@args); + my @probe_args = compiler_runtime_probe_args(@args); + + foreach my $probe ("-print-libgcc-file-name", "-print-file-name=libgcc.a") { + my $path = capture_command_output(@compiler, @probe_args, $probe); + chomp $path; + next if $path eq "" || $path eq "libgcc.a"; + return $path if -f $path; + } + + return "-lgcc"; +} + # expect at least: alt-load-address gcc -o foo bar.o die "Not enough arguments" if (($#ARGV + 1) < 5); @@ -62,7 +140,9 @@ END # build up the complete command here: -# 'cc' -Wl,-Mtmpfile 'restargs' +# 'cc' -Wl,-Mtmpfile 'restargs' compiler-runtime-archive + +my $compiler_runtime = compiler_runtime_archive(@ARGV[1 .. $#ARGV]); my $cmd="$cc -Wl,-M/proc/$$/fd/" . fileno($fh); @@ -71,6 +151,8 @@ $cmd = "$cmd $ARGV[$n]"; } +$cmd = "$cmd $compiler_runtime"; + #print "link_tool_exe_solaris: $cmd\n"; diff -urN a/dhat/Makefile.in b/dhat/Makefile.in --- a/dhat/Makefile.in 2025-10-24 13:43:45.000000000 -0500 +++ b/dhat/Makefile.in 2026-03-22 12:59:22.461512099 -0500 @@ -767,7 +767,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/drd/Makefile.in b/drd/Makefile.in --- a/drd/Makefile.in 2025-10-24 13:43:45.000000000 -0500 +++ b/drd/Makefile.in 2026-03-22 12:59:22.460512064 -0500 @@ -848,7 +848,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/exp-bbv/Makefile.in b/exp-bbv/Makefile.in --- a/exp-bbv/Makefile.in 2025-10-24 13:43:45.000000000 -0500 +++ b/exp-bbv/Makefile.in 2026-03-22 12:59:22.462512134 -0500 @@ -703,7 +703,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/helgrind/Makefile.in b/helgrind/Makefile.in --- a/helgrind/Makefile.in 2025-10-24 13:43:46.000000000 -0500 +++ b/helgrind/Makefile.in 2026-03-22 12:59:22.464050754 -0500 @@ -790,7 +790,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/lackey/Makefile.in b/lackey/Makefile.in --- a/lackey/Makefile.in 2025-10-24 13:43:46.000000000 -0500 +++ b/lackey/Makefile.in 2026-03-22 12:59:22.461512099 -0500 @@ -703,7 +703,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/massif/Makefile.in b/massif/Makefile.in --- a/massif/Makefile.in 2025-10-24 13:43:46.000000000 -0500 +++ b/massif/Makefile.in 2026-03-22 12:59:22.462512134 -0500 @@ -757,7 +757,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/memcheck/Makefile.in b/memcheck/Makefile.in --- a/memcheck/Makefile.in 2025-10-24 13:43:46.000000000 -0500 +++ b/memcheck/Makefile.in 2026-03-22 12:59:22.459512028 -0500 @@ -790,7 +790,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/none/Makefile.in b/none/Makefile.in --- a/none/Makefile.in 2025-10-24 13:43:47.000000000 -0500 +++ b/none/Makefile.in 2026-03-22 12:59:22.461512099 -0500 @@ -701,7 +701,7 @@ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/coregrind/libcoregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a \ @VGCONF_HAVE_PLATFORM_SEC_TRUE@ $(top_builddir)/VEX/libvex-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) \ $(TOOL_LDADD_COMMON) $(am__append_7) $(am__append_9) diff -urN a/none/tests/Makefile.am b/none/tests/Makefile.am --- a/none/tests/Makefile.am 2025-10-24 13:43:21.000000000 -0500 +++ b/none/tests/Makefile.am 2026-03-22 12:59:22.458511993 -0500 @@ -502,9 +502,8 @@ vgprintf_nvalgrind_CFLAGS = ${AM_CFLAGS} -DNVALGRIND valgrind_cpp_test_SOURCES = valgrind_cpp_test.cpp -valgrind_cpp_test_LDADD = -lstdc++ +valgrind_cpp_test_LDADD = # C++ tests coolo_sigaction_SOURCES = coolo_sigaction.cpp gxx304_SOURCES = gxx304.cpp - diff -urN a/none/tests/Makefile.in b/none/tests/Makefile.in --- a/none/tests/Makefile.in 2025-10-24 13:43:47.000000000 -0500 +++ b/none/tests/Makefile.in 2026-03-22 12:59:22.459512028 -0500 @@ -1581,7 +1581,7 @@ vgprintf_nvalgrind_SOURCES = vgprintf.c vgprintf_nvalgrind_CFLAGS = ${AM_CFLAGS} -DNVALGRIND valgrind_cpp_test_SOURCES = valgrind_cpp_test.cpp -valgrind_cpp_test_LDADD = -lstdc++ +valgrind_cpp_test_LDADD = # C++ tests coolo_sigaction_SOURCES = coolo_sigaction.cpp diff -urN a/valgrind.pc.in b/valgrind.pc.in --- a/valgrind.pc.in 2025-10-24 13:43:21.000000000 -0500 +++ b/valgrind.pc.in 2026-03-22 12:59:22.458511993 -0500 @@ -11,6 +11,5 @@ Description: A dynamic binary instrumentation framework Version: @VERSION@ Requires: -Libs: -L${libdir}/valgrind -lcoregrind-@VGCONF_ARCH_PRI@-@VGCONF_OS@ -lvex-@VGCONF_ARCH_PRI@-@VGCONF_OS@ -lgcc +Libs: -L${libdir}/valgrind -lcoregrind-@VGCONF_ARCH_PRI@-@VGCONF_OS@ -lvex-@VGCONF_ARCH_PRI@-@VGCONF_OS@ Cflags: -I${includedir} -