[PATCH] Add --with-system-libbacktrace

John Ericson <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
We have other --with-system-* flags for using pre-installed libraries,
but not for libbacktrace. It might not be *prudent* to use a
libbacktrace other than the in-tree one, but that doesn't mean we should
make it impossible to *try*.

For most consumers this just swaps a relative path for -lbacktrace.
libstdc++, however, normally compiles the sources itself with every
symbol renamed. Using a pre-built libbacktrace for it is therefore a
larger change, as it entails exposing those symbols downstream, where
they may conflict with a libbacktrace the program links for itself.

The libstdc++ renaming, now being optional, is simply implemented by
using the normal identifiers in libstdc++'s own source files, and then
applying the same renaming trick that was previously used only on the
vendored libbacktrace to libstdc++ itself.

Note: I see I am not actually allowed to modify libgo this way, since it
is itself vendored.  (One vendored source tree referring to a another
vendored source tree it happens to be vendored alongside with?  The
horror!)  I am doing so anyway, on the assumption that this patch will
be discussed before it lands, and one email is simpler.

config/ChangeLog:

	* libbacktrace.m4: New file.

gcc/ChangeLog:

	* configure.ac: Use GCC_WITH_SYSTEM_LIBBACKTRACE and
	GCC_CHECK_SYSTEM_LIBBACKTRACE, and substitute BACKTRACEINC,
	LIBBACKTRACE and LIBBACKTRACE_DEP.
	* Makefile.in (BACKTRACEINC, LIBBACKTRACE): Take from configure.
	(LIBBACKTRACE_DEP): New variable.
	(LIBDEPS): Depend on it rather than on LIBBACKTRACE, which may
	name an installed library.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.

libgfortran/ChangeLog:

	* configure.ac: Use GCC_WITH_SYSTEM_LIBBACKTRACE and
	GCC_CHECK_SYSTEM_LIBBACKTRACE, and define the SYSTEM_LIBBACKTRACE
	conditional.
	* Makefile.am (LIBBACKTRACE_LIB, LIBBACKTRACE_INCLUDE): New
	variables.
	(libgfortran_la_LDFLAGS, AM_CPPFLAGS): Use them.
	* Makefile.in: Regenerate.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.

ChangeLog:

	* libgo/configure.ac: Use GCC_WITH_SYSTEM_LIBBACKTRACE and
	GCC_CHECK_SYSTEM_LIBBACKTRACE, and define the SYSTEM_LIBBACKTRACE
	conditional.
	* libgo/Makefile.am (LIBBACKTRACE_LIB, LIBBACKTRACE_INCLUDE): New
	variables.
	(libgo_libadd, AM_CFLAGS): Use them.
	* libgo/Makefile.in: Regenerate.
	* libgo/aclocal.m4: Regenerate.
	* libgo/configure: Regenerate.

libphobos/ChangeLog:

	* m4/druntime/libraries.m4 (DRUNTIME_LIBRARIES_BACKTRACE): Use
	GCC_WITH_SYSTEM_LIBBACKTRACE and GCC_CHECK_SYSTEM_LIBBACKTRACE,
	and select the library and include path accordingly.
	* Makefile.in: Regenerate.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.
	* libdruntime/Makefile.in: Regenerate.
	* src/Makefile.in: Regenerate.
	* testsuite/Makefile.in: Regenerate.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Use
	GCC_WITH_SYSTEM_LIBBACKTRACE and GCC_CHECK_SYSTEM_LIBBACKTRACE.
	Skip the capability probes when an installed library is used, and
	define the ENABLE_SYSTEM_BACKTRACE and ENABLE_VENDORED_BACKTRACE
	conditionals.
	* src/Makefile.am (backtrace_dir, backtrace_supported_h): Build
	the in-tree copy only under ENABLE_VENDORED_BACKTRACE.
	* src/c++23/Makefile.am (AM_CXXFLAGS): Include
	backtrace-rename.h when building that copy, so that the caller is
	renamed along with it.
	* src/c++23/stacktrace.cc: Declare and call libbacktrace by its
	ordinary names; the renaming is now applied by the build.
	* src/experimental/Makefile.am (backtrace_lib): Name -lbacktrace
	when an installed library is used.
	(backtrace_dep): New variable, empty in that case.
	(libstdc__exp_la_DEPENDENCIES): Use it.
	* Makefile.in: Regenerate.
	* aclocal.m4: Regenerate.
	* configure: Regenerate.
	* doc/Makefile.in: Regenerate.
	* include/Makefile.in: Regenerate.
	* libsupc++/Makefile.in: Regenerate.
	* po/Makefile.in: Regenerate.
	* python/Makefile.in: Regenerate.
	* src/Makefile.in: Regenerate.
	* src/c++11/Makefile.in: Regenerate.
	* src/c++17/Makefile.in: Regenerate.
	* src/c++20/Makefile.in: Regenerate.
	* src/c++23/Makefile.in: Regenerate.
	* src/c++26/Makefile.in: Regenerate.
	* src/c++98/Makefile.in: Regenerate.
	* src/experimental/Makefile.in: Regenerate.
	* src/filesystem/Makefile.in: Regenerate.
	* src/libbacktrace/Makefile.in: Regenerate.
	* testsuite/Makefile.in: Regenerate.

Signed-off-by: John Ericson <[email protected]>
---
 config/libbacktrace.m4                    | 37 +++++++++
 gcc/Makefile.in                           | 10 ++-
 gcc/aclocal.m4                            |  1 +
 gcc/configure                             | 52 ++++++++++++-
 gcc/configure.ac                          | 15 ++++
 libgfortran/Makefile.am                   | 16 +++-
 libgfortran/Makefile.in                   | 14 +++-
 libgfortran/aclocal.m4                    |  1 +
 libgfortran/configure                     | 51 +++++++++++-
 libgfortran/configure.ac                  |  6 ++
 libgo/Makefile.am                         | 12 ++-
 libgo/Makefile.in                         | 25 +++---
 libgo/aclocal.m4                          |  1 +
 libgo/configure                           | 51 +++++++++++-
 libgo/configure.ac                        |  4 +
 libgo/testsuite/Makefile.in               |  1 +
 libphobos/Makefile.in                     |  1 +
 libphobos/aclocal.m4                      |  1 +
 libphobos/configure                       | 49 +++++++++++-
 libphobos/libdruntime/Makefile.in         |  1 +
 libphobos/m4/druntime/libraries.m4        | 12 ++-
 libphobos/src/Makefile.in                 |  1 +
 libphobos/testsuite/Makefile.in           |  1 +
 libstdc++-v3/Makefile.in                  |  1 +
 libstdc++-v3/acinclude.m4                 | 27 +++++++
 libstdc++-v3/aclocal.m4                   |  1 +
 libstdc++-v3/configure                    | 94 +++++++++++++++++++++--
 libstdc++-v3/doc/Makefile.in              |  1 +
 libstdc++-v3/include/Makefile.in          |  1 +
 libstdc++-v3/libsupc++/Makefile.in        |  1 +
 libstdc++-v3/po/Makefile.in               |  1 +
 libstdc++-v3/python/Makefile.in           |  1 +
 libstdc++-v3/src/Makefile.am              |  6 +-
 libstdc++-v3/src/Makefile.in              | 17 ++--
 libstdc++-v3/src/c++11/Makefile.in        |  1 +
 libstdc++-v3/src/c++17/Makefile.in        |  1 +
 libstdc++-v3/src/c++20/Makefile.in        |  1 +
 libstdc++-v3/src/c++23/Makefile.am        |  8 ++
 libstdc++-v3/src/c++23/Makefile.in        | 18 +++--
 libstdc++-v3/src/c++23/stacktrace.cc      | 24 +++---
 libstdc++-v3/src/c++26/Makefile.in        |  1 +
 libstdc++-v3/src/c++98/Makefile.in        |  1 +
 libstdc++-v3/src/experimental/Makefile.am |  9 ++-
 libstdc++-v3/src/experimental/Makefile.in | 11 ++-
 libstdc++-v3/src/filesystem/Makefile.in   |  1 +
 libstdc++-v3/src/libbacktrace/Makefile.in |  1 +
 libstdc++-v3/testsuite/Makefile.in        |  1 +
 47 files changed, 517 insertions(+), 75 deletions(-)
 create mode 100644 config/libbacktrace.m4

diff --git a/config/libbacktrace.m4 b/config/libbacktrace.m4
new file mode 100644
index 00000000000..a8bfff4914b
--- /dev/null
+++ b/config/libbacktrace.m4
@@ -0,0 +1,37 @@
+dnl Copyright (C) 2026 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Support for linking an installed libbacktrace rather than the copy that
+dnl lives in the GCC tree.
+AC_DEFUN([GCC_WITH_SYSTEM_LIBBACKTRACE], [
+  AC_ARG_WITH([system-libbacktrace],
+    AS_HELP_STRING([--with-system-libbacktrace],
+      [link an installed libbacktrace instead of the copy in the GCC tree]),
+    [with_system_libbacktrace=$withval],
+    [with_system_libbacktrace=no])
+
+  dnl No e.g. paths supported at this time, just yes or no.
+  case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) AC_MSG_ERROR([--with-system-libbacktrace does not take an argument]) ;;
+  esac
+])
+
+dnl Insist the installed library is really there, so that its absence is
+dnl reported here rather than as an undefined reference at the end of a build.
+dnl
+dnl Separate from the option itself, because a component may not know whether
+dnl it needs libbacktrace at the point the option is parsed: libstdc++
+dnl resolves --enable-libstdcxx-backtrace=auto much later, and should
+dnl not demand a library it has decided *not* to use.
+AC_DEFUN([GCC_CHECK_SYSTEM_LIBBACKTRACE], [
+  AC_REQUIRE([GCC_WITH_SYSTEM_LIBBACKTRACE])
+  if test "x$with_system_libbacktrace" = xyes; then
+    AC_CHECK_HEADER([backtrace.h], [],
+      [AC_MSG_ERROR([--with-system-libbacktrace given, but backtrace.h not found])])
+  fi
+])
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index ce5894767fe..efcd6dffd55 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -455,9 +455,11 @@ DECNUMINC = -I$(DECNUM) -I$(DECNUMFMT) -I../libdecnumber
 LIBDECNUMBER = ../libdecnumber/libdecnumber.a
 
 # The backtrace library.
-BACKTRACE = $(srcdir)/../libbacktrace
-BACKTRACEINC = -I$(BACKTRACE)
-LIBBACKTRACE = ../libbacktrace/.libs/libbacktrace.a
+# With --with-system-libbacktrace these come from configure as -lbacktrace
+# and the ordinary header path, and LIBBACKTRACE_DEP is empty.
+BACKTRACEINC = @BACKTRACEINC@
+LIBBACKTRACE = @LIBBACKTRACE@
+LIBBACKTRACE_DEP = @LIBBACKTRACE_DEP@
 
 # Target to use when installing include directory.  Either
 # install-headers-tar, install-headers-cpio or install-headers-cp.
@@ -1149,7 +1151,7 @@ endif
 # constructed with a ./ prefix, which GNU Make removes while processing
 # prerequisites, so we need to strip it off.
 LIBDEPS= libcommon.a $(CPPLIB) $(LIBIBERTY) $(LIBICONV_DEP) $(LIBDECNUMBER) \
-	$(LIBBACKTRACE) $(LIBINTL_DEP:./%=%)
+	$(LIBBACKTRACE_DEP) $(LIBINTL_DEP:./%=%)
 
 # Likewise, for use in the tools that must run on this machine
 # even if we are cross-building GCC.
diff --git a/gcc/aclocal.m4 b/gcc/aclocal.m4
index e44fc5fb2ab..3dc9320c6d7 100644
--- a/gcc/aclocal.m4
+++ b/gcc/aclocal.m4
@@ -84,6 +84,7 @@ m4_include([../config/lead-dot.m4])
 m4_include([../config/lib-ld.m4])
 m4_include([../config/lib-link.m4])
 m4_include([../config/lib-prefix.m4])
+m4_include([../config/libbacktrace.m4])
 m4_include([../config/mmap.m4])
 m4_include([../config/nls.m4])
 m4_include([../config/override.m4])
diff --git a/gcc/configure b/gcc/configure
index f8501781474..0375079933e 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -878,6 +878,9 @@ c_strict_warn
 strict_warn
 c_loose_warn
 loose_warn
+LIBBACKTRACE_DEP
+LIBBACKTRACE
+BACKTRACEINC
 CPP
 EGREP
 GREP
@@ -977,6 +980,7 @@ with_dsymutil
 with_as
 with_windres
 enable_largefile
+with_system_libbacktrace
 enable_build_format_warnings
 enable_werror_always
 enable_checking
@@ -1875,6 +1879,9 @@ Optional Packages:
                           pathname)
   --with-as               arrange to use the specified as (full pathname)
   --with-windres          arrange to use the specified windres (full pathname)
+  --with-system-libbacktrace
+                          link an installed libbacktrace instead of the copy
+                          in the GCC tree
   --with-stack-clash-protection-guard-size=size
                           Set the default stack clash protection guard size
                           for specific targets as a power of two in bytes.
@@ -7025,6 +7032,47 @@ fi
 
 
 
+
+
+
+# Check whether --with-system-libbacktrace was given.
+if test "${with_system_libbacktrace+set}" = set; then :
+  withval=$with_system_libbacktrace; with_system_libbacktrace=$withval
+else
+  with_system_libbacktrace=no
+fi
+
+
+    case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) as_fn_error $? "--with-system-libbacktrace does not take an argument" "$LINENO" 5 ;;
+  esac
+
+
+
+  if test "x$with_system_libbacktrace" = xyes; then
+    ac_fn_cxx_check_header_mongrel "$LINENO" "backtrace.h" "ac_cv_header_backtrace_h" "$ac_includes_default"
+if test "x$ac_cv_header_backtrace_h" = xyes; then :
+
+else
+  as_fn_error $? "--with-system-libbacktrace given, but backtrace.h not found" "$LINENO" 5
+fi
+
+
+  fi
+
+if test "x$with_system_libbacktrace" = xyes; then
+  BACKTRACEINC=
+  LIBBACKTRACE=-lbacktrace
+  LIBBACKTRACE_DEP=
+else
+  BACKTRACEINC='-I$(srcdir)/../libbacktrace'
+  LIBBACKTRACE='../libbacktrace/.libs/libbacktrace.a'
+  LIBBACKTRACE_DEP='$(LIBBACKTRACE)'
+fi
+
+
+
 if test x"$ac_cv_c_uint64_t" = x"no" -o x"$ac_cv_c_int64_t" = x"no"; then
   as_fn_error $? "uint64_t or int64_t not found" "$LINENO" 5
 fi
@@ -21921,7 +21969,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 21924 "configure"
+#line 21972 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -22027,7 +22075,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 22030 "configure"
+#line 22078 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 1773706e70a..646452011b6 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -525,6 +525,21 @@ AC_CHECK_SIZEOF(int)
 AC_CHECK_SIZEOF(long)
 AC_CHECK_TYPES([long long], [AC_CHECK_SIZEOF(long long)])
 GCC_STDINT_TYPES
+
+GCC_WITH_SYSTEM_LIBBACKTRACE
+GCC_CHECK_SYSTEM_LIBBACKTRACE
+if test "x$with_system_libbacktrace" = xyes; then
+  BACKTRACEINC=
+  LIBBACKTRACE=-lbacktrace
+  LIBBACKTRACE_DEP=
+else
+  BACKTRACEINC='-I$(srcdir)/../libbacktrace'
+  LIBBACKTRACE='../libbacktrace/.libs/libbacktrace.a'
+  LIBBACKTRACE_DEP='$(LIBBACKTRACE)'
+fi
+AC_SUBST(BACKTRACEINC)
+AC_SUBST(LIBBACKTRACE)
+AC_SUBST(LIBBACKTRACE_DEP)
 if test x"$ac_cv_c_uint64_t" = x"no" -o x"$ac_cv_c_int64_t" = x"no"; then
   AC_MSG_ERROR([uint64_t or int64_t not found])
 fi
diff --git a/libgfortran/Makefile.am b/libgfortran/Makefile.am
index e88c88d9e00..e84082793fc 100644
--- a/libgfortran/Makefile.am
+++ b/libgfortran/Makefile.am
@@ -48,11 +48,21 @@ gfor_cdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
 LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS)) \
 	    $(lt_host_flags)
 
+if SYSTEM_LIBBACKTRACE
+LIBBACKTRACE_LIB = -lbacktrace
+LIBBACKTRACE_INCLUDE =
+else
+LIBBACKTRACE_LIB = ../libbacktrace/libbacktrace.la
+LIBBACKTRACE_INCLUDE = -I$(srcdir)/$(MULTISRCTOP)../libbacktrace \
+	      -I$(MULTIBUILDTOP)../libbacktrace \
+	      -I../libbacktrace
+endif
+
 toolexeclib_LTLIBRARIES = libgfortran.la
 toolexeclib_DATA = libgfortran.spec
 libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
 libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
-	$(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \
+	$(LTLDFLAGS) $(LIBQUADLIB) $(LIBBACKTRACE_LIB) \
 	$(HWCAP_LDFLAGS) \
 	$(LIBM) $(extra_darwin_ldflags_libgfortran) \
 	$(version_arg) -Wc,-shared-libgcc
@@ -98,9 +108,7 @@ AM_CPPFLAGS = -iquote$(srcdir)/io -I$(srcdir)/$(MULTISRCTOP)../gcc \
 	      -I$(MULTIBUILDTOP)../../$(host_subdir)/gcc \
 	      -I$(srcdir)/$(MULTISRCTOP)../libgcc \
 	      -I$(MULTIBUILDTOP)../libgcc \
-	      -I$(srcdir)/$(MULTISRCTOP)../libbacktrace \
-	      -I$(MULTIBUILDTOP)../libbacktrace \
-	      -I../libbacktrace
+	      $(LIBBACKTRACE_INCLUDE)
 
 # Fortran rules for complex multiplication and division
 AM_CFLAGS += -fcx-fortran-rules
diff --git a/libgfortran/Makefile.in b/libgfortran/Makefile.in
index 8564b7de675..bf076af7130 100644
--- a/libgfortran/Makefile.in
+++ b/libgfortran/Makefile.in
@@ -166,6 +166,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/ax_pthread.m4 \
 	$(top_srcdir)/../config/gcc-plugin.m4 \
 	$(top_srcdir)/../config/hwcaps.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
@@ -981,11 +982,18 @@ gfor_cdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
 LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS)) \
 	    $(lt_host_flags)
 
+@SYSTEM_LIBBACKTRACE_FALSE@LIBBACKTRACE_LIB = ../libbacktrace/libbacktrace.la
+@SYSTEM_LIBBACKTRACE_TRUE@LIBBACKTRACE_LIB = -lbacktrace
+@SYSTEM_LIBBACKTRACE_FALSE@LIBBACKTRACE_INCLUDE = -I$(srcdir)/$(MULTISRCTOP)../libbacktrace \
+@SYSTEM_LIBBACKTRACE_FALSE@	      -I$(MULTIBUILDTOP)../libbacktrace \
+@SYSTEM_LIBBACKTRACE_FALSE@	      -I../libbacktrace
+
+@SYSTEM_LIBBACKTRACE_TRUE@LIBBACKTRACE_INCLUDE = 
 toolexeclib_LTLIBRARIES = libgfortran.la
 toolexeclib_DATA = libgfortran.spec
 libgfortran_la_LINK = $(LINK) $(libgfortran_la_LDFLAGS)
 libgfortran_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
-	$(LTLDFLAGS) $(LIBQUADLIB) ../libbacktrace/libbacktrace.la \
+	$(LTLDFLAGS) $(LIBQUADLIB) $(LIBBACKTRACE_LIB) \
 	$(HWCAP_LDFLAGS) \
 	$(LIBM) $(extra_darwin_ldflags_libgfortran) \
 	$(version_arg) -Wc,-shared-libgcc
@@ -1021,9 +1029,7 @@ AM_CPPFLAGS = -iquote$(srcdir)/io -I$(srcdir)/$(MULTISRCTOP)../gcc \
 	      -I$(MULTIBUILDTOP)../../$(host_subdir)/gcc \
 	      -I$(srcdir)/$(MULTISRCTOP)../libgcc \
 	      -I$(MULTIBUILDTOP)../libgcc \
-	      -I$(srcdir)/$(MULTISRCTOP)../libbacktrace \
-	      -I$(MULTIBUILDTOP)../libbacktrace \
-	      -I../libbacktrace
+	      $(LIBBACKTRACE_INCLUDE)
 
 gfor_io_src = io/size_from_kind.c $(am__append_4)
 gfor_io_headers = \
diff --git a/libgfortran/aclocal.m4 b/libgfortran/aclocal.m4
index c1e2f6dc502..713d72822e0 100644
--- a/libgfortran/aclocal.m4
+++ b/libgfortran/aclocal.m4
@@ -1173,6 +1173,7 @@ m4_include([../config/depstand.m4])
 m4_include([../config/gcc-plugin.m4])
 m4_include([../config/hwcaps.m4])
 m4_include([../config/lead-dot.m4])
+m4_include([../config/libbacktrace.m4])
 m4_include([../config/lthostflags.m4])
 m4_include([../config/multi.m4])
 m4_include([../config/override.m4])
diff --git a/libgfortran/configure b/libgfortran/configure
index 6d31fa11be2..dc77852c20d 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -704,6 +704,8 @@ HAVE_REAL_17_FALSE
 HAVE_REAL_17_TRUE
 toolexeclibdir
 toolexecdir
+SYSTEM_LIBBACKTRACE_FALSE
+SYSTEM_LIBBACKTRACE_TRUE
 EGREP
 GREP
 CPP
@@ -820,6 +822,7 @@ enable_maintainer_mode
 enable_multilib
 enable_dependency_tracking
 with_toolexeclibdir
+with_system_libbacktrace
 enable_cet
 enable_symvers
 with_gnu_ld
@@ -1497,6 +1500,9 @@ Optional Packages:
   --with-toolexeclibdir=DIR
                           install libraries built with a cross compiler within
                           DIR
+  --with-system-libbacktrace
+                          link an installed libbacktrace instead of the copy
+                          in the GCC tree
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-pic              try to use only PIC/non-PIC objects [default=use
                           both]
@@ -5186,6 +5192,43 @@ fi
 
 
 
+
+
+# Check whether --with-system-libbacktrace was given.
+if test "${with_system_libbacktrace+set}" = set; then :
+  withval=$with_system_libbacktrace; with_system_libbacktrace=$withval
+else
+  with_system_libbacktrace=no
+fi
+
+
+    case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) as_fn_error $? "--with-system-libbacktrace does not take an argument" "$LINENO" 5 ;;
+  esac
+
+
+
+  if test "x$with_system_libbacktrace" = xyes; then
+    ac_fn_c_check_header_mongrel "$LINENO" "backtrace.h" "ac_cv_header_backtrace_h" "$ac_includes_default"
+if test "x$ac_cv_header_backtrace_h" = xyes; then :
+
+else
+  as_fn_error $? "--with-system-libbacktrace given, but backtrace.h not found" "$LINENO" 5
+fi
+
+
+  fi
+
+ if test "x$with_system_libbacktrace" = xyes; then
+  SYSTEM_LIBBACKTRACE_TRUE=
+  SYSTEM_LIBBACKTRACE_FALSE='#'
+else
+  SYSTEM_LIBBACKTRACE_TRUE='#'
+  SYSTEM_LIBBACKTRACE_FALSE=
+fi
+
+
 # Calculate toolexeclibdir
 # Also toolexecdir, though it's only used in toolexeclibdir
 case ${version_specific_libs} in
@@ -13245,7 +13288,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 13248 "configure"
+#line 13291 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -13351,7 +13394,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 13354 "configure"
+#line 13397 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -32919,6 +32962,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${SYSTEM_LIBBACKTRACE_TRUE}" && test -z "${SYSTEM_LIBBACKTRACE_FALSE}"; then
+  as_fn_error $? "conditional \"SYSTEM_LIBBACKTRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index c5f84a031cd..ec333a43a3e 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -75,6 +75,12 @@ AC_USE_SYSTEM_EXTENSIONS
 
 GCC_WITH_TOOLEXECLIBDIR
 
+GCC_WITH_SYSTEM_LIBBACKTRACE
+GCC_CHECK_SYSTEM_LIBBACKTRACE
+dnl This is separate from the top to because the other consumers of
+dnl those do not use an automake conditional like this.
+AM_CONDITIONAL(SYSTEM_LIBBACKTRACE, [test "x$with_system_libbacktrace" = xyes])
+
 # Calculate toolexeclibdir
 # Also toolexecdir, though it's only used in toolexeclibdir
 case ${version_specific_libs} in
diff --git a/libgo/Makefile.am b/libgo/Makefile.am
index d139d7818ec..1f4bd1c77de 100644
--- a/libgo/Makefile.am
+++ b/libgo/Makefile.am
@@ -46,10 +46,18 @@ AM_CPPFLAGS = -I $(srcdir)/runtime $(LIBFFIINCS) $(PTHREAD_CFLAGS)
 
 ACLOCAL_AMFLAGS = -I ./config -I ../config
 
+if SYSTEM_LIBBACKTRACE
+LIBBACKTRACE_LIB = -lbacktrace
+LIBBACKTRACE_INCLUDE =
+else
+LIBBACKTRACE_LIB = ../libbacktrace/libbacktrace.la
+LIBBACKTRACE_INCLUDE = -I $(srcdir)/../libbacktrace
+endif
+
 AM_CFLAGS = -fexceptions -fnon-call-exceptions \
 	$(SPLIT_STACK) $(WARN_CFLAGS) \
 	$(STRINGOPS_FLAG) $(HWCAP_CFLAGS) $(OSCFLAGS) \
-	-I $(srcdir)/../libgcc -I $(srcdir)/../libbacktrace \
+	-I $(srcdir)/../libgcc $(LIBBACKTRACE_INCLUDE) \
 	-I $(MULTIBUILDTOP)../../gcc/include
 
 AM_LDFLAGS =
@@ -841,7 +849,7 @@ libgo_ldflags = \
 	$(OSLDFLAGS)
 
 libgo_libadd = \
-	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
+	$(libgo_go_objs) $(LIBBACKTRACE_LIB) \
 	$(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS)
 
 libgo_la_SOURCES = $(runtime_files)
diff --git a/libgo/Makefile.in b/libgo/Makefile.in
index 6e194d084da..9127544aa63 100644
--- a/libgo/Makefile.in
+++ b/libgo/Makefile.in
@@ -112,6 +112,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
 	$(top_srcdir)/../config/hwcaps.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
@@ -230,12 +231,14 @@ am__DEPENDENCIES_3 = $(addsuffix .lo,$(PACKAGES)) \
 	$(golangorg_x_net_route_lo) log/syslog/syslog_c.lo \
 	runtime/internal/atomic_c.lo sync/atomic_c.lo \
 	internal/cpu/cpu_gccgo.lo $(am__DEPENDENCIES_2)
-am__DEPENDENCIES_4 =
-am__DEPENDENCIES_5 = $(am__DEPENDENCIES_3) \
-	../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_4) \
-	$(am__DEPENDENCIES_4) $(am__DEPENDENCIES_4) \
-	$(am__DEPENDENCIES_4) $(am__DEPENDENCIES_4)
-libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_5)
+@SYSTEM_LIBBACKTRACE_FALSE@am__DEPENDENCIES_4 =  \
+@SYSTEM_LIBBACKTRACE_FALSE@	../libbacktrace/libbacktrace.la
+am__DEPENDENCIES_5 =
+am__DEPENDENCIES_6 = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_4) \
+	$(am__DEPENDENCIES_5) $(am__DEPENDENCIES_5) \
+	$(am__DEPENDENCIES_5) $(am__DEPENDENCIES_5) \
+	$(am__DEPENDENCIES_5)
+libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_6)
 @LIBGO_IS_LINUX_TRUE@@LIBGO_IS_X86_TRUE@am__objects_1 =  \
 @LIBGO_IS_LINUX_TRUE@@LIBGO_IS_X86_TRUE@	runtime/go-context.lo
 am__objects_2 = $(am__objects_1)
@@ -265,7 +268,7 @@ libgo_llgo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(libgo_llgo_la_LDFLAGS) $(LDFLAGS) -o $@
 @GOC_IS_LLGO_TRUE@am_libgo_llgo_la_rpath = -rpath $(toolexeclibdir)
-libgo_la_DEPENDENCIES = $(am__DEPENDENCIES_5)
+libgo_la_DEPENDENCIES = $(am__DEPENDENCIES_6)
 am_libgo_la_OBJECTS = $(am__objects_4)
 libgo_la_OBJECTS = $(am_libgo_la_OBJECTS)
 libgo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -564,10 +567,14 @@ WARN_CFLAGS = $(WARN_FLAGS) $(WERROR)
 # -I/-D flags to pass when compiling.
 AM_CPPFLAGS = -I $(srcdir)/runtime $(LIBFFIINCS) $(PTHREAD_CFLAGS)
 ACLOCAL_AMFLAGS = -I ./config -I ../config
+@SYSTEM_LIBBACKTRACE_FALSE@LIBBACKTRACE_LIB = ../libbacktrace/libbacktrace.la
+@SYSTEM_LIBBACKTRACE_TRUE@LIBBACKTRACE_LIB = -lbacktrace
+@SYSTEM_LIBBACKTRACE_FALSE@LIBBACKTRACE_INCLUDE = -I $(srcdir)/../libbacktrace
+@SYSTEM_LIBBACKTRACE_TRUE@LIBBACKTRACE_INCLUDE = 
 AM_CFLAGS = -fexceptions -fnon-call-exceptions \
 	$(SPLIT_STACK) $(WARN_CFLAGS) \
 	$(STRINGOPS_FLAG) $(HWCAP_CFLAGS) $(OSCFLAGS) \
-	-I $(srcdir)/../libgcc -I $(srcdir)/../libbacktrace \
+	-I $(srcdir)/../libgcc $(LIBBACKTRACE_INCLUDE) \
 	-I $(MULTIBUILDTOP)../../gcc/include
 
 AM_LDFLAGS = $(am__append_1) $(am__append_2)
@@ -977,7 +984,7 @@ libgo_ldflags = \
 	$(OSLDFLAGS)
 
 libgo_libadd = \
-	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
+	$(libgo_go_objs) $(LIBBACKTRACE_LIB) \
 	$(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS)
 
 libgo_la_SOURCES = $(runtime_files)
diff --git a/libgo/aclocal.m4 b/libgo/aclocal.m4
index 739b97a0275..aeee43c864a 100644
--- a/libgo/aclocal.m4
+++ b/libgo/aclocal.m4
@@ -1190,6 +1190,7 @@ AC_SUBST([am__untar])
 m4_include([../config/depstand.m4])
 m4_include([../config/hwcaps.m4])
 m4_include([../config/lead-dot.m4])
+m4_include([../config/libbacktrace.m4])
 m4_include([../config/multi.m4])
 m4_include([../config/override.m4])
 m4_include([../config/toolexeclibdir.m4])
diff --git a/libgo/configure b/libgo/configure
index fa290d43ba2..abc0f5ff002 100755
--- a/libgo/configure
+++ b/libgo/configure
@@ -634,6 +634,8 @@ am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
 SYSROOT_CFLAGS_FOR_TARGET
+SYSTEM_LIBBACKTRACE_FALSE
+SYSTEM_LIBBACKTRACE_TRUE
 HAVE_STATIC_LINK_FALSE
 HAVE_STATIC_LINK_TRUE
 HAVE_STAT_TIMESPEC_FALSE
@@ -860,6 +862,7 @@ with_toolexeclibdir
 with_libffi
 with_libatomic
 with_system_libunwind
+with_system_libbacktrace
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1517,6 +1520,9 @@ Optional Packages:
   --without-libffi        don't use libffi
   --without-libatomic     don't use libatomic
   --with-system-libunwind use installed libunwind
+  --with-system-libbacktrace
+                          link an installed libbacktrace instead of the copy
+                          in the GCC tree
 
 Some influential environment variables:
   CC          C compiler command
@@ -11548,7 +11554,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11551 "configure"
+#line 11557 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11654,7 +11660,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11657 "configure"
+#line 11663 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16179,6 +16185,43 @@ fi
 
 
 
+# Check whether --with-system-libbacktrace was given.
+if test "${with_system_libbacktrace+set}" = set; then :
+  withval=$with_system_libbacktrace; with_system_libbacktrace=$withval
+else
+  with_system_libbacktrace=no
+fi
+
+
+    case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) as_fn_error $? "--with-system-libbacktrace does not take an argument" "$LINENO" 5 ;;
+  esac
+
+
+
+  if test "x$with_system_libbacktrace" = xyes; then
+    ac_fn_c_check_header_mongrel "$LINENO" "backtrace.h" "ac_cv_header_backtrace_h" "$ac_includes_default"
+if test "x$ac_cv_header_backtrace_h" = xyes; then :
+
+else
+  as_fn_error $? "--with-system-libbacktrace given, but backtrace.h not found" "$LINENO" 5
+fi
+
+
+  fi
+
+ if test "x$with_system_libbacktrace" = xyes; then
+  SYSTEM_LIBBACKTRACE_TRUE=
+  SYSTEM_LIBBACKTRACE_FALSE='#'
+else
+  SYSTEM_LIBBACKTRACE_TRUE='#'
+  SYSTEM_LIBBACKTRACE_FALSE=
+fi
+
+
+
+
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
 # tests run on this system so they can be shared between configure
@@ -16507,6 +16550,10 @@ if test -z "${HAVE_STATIC_LINK_TRUE}" && test -z "${HAVE_STATIC_LINK_FALSE}"; th
   as_fn_error $? "conditional \"HAVE_STATIC_LINK\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${SYSTEM_LIBBACKTRACE_TRUE}" && test -z "${SYSTEM_LIBBACKTRACE_FALSE}"; then
+  as_fn_error $? "conditional \"SYSTEM_LIBBACKTRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
diff --git a/libgo/configure.ac b/libgo/configure.ac
index 0004819d967..95e2688002b 100644
--- a/libgo/configure.ac
+++ b/libgo/configure.ac
@@ -931,6 +931,10 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM(,)],
 LDFLAGS=$LDFLAGS_hold])
 AM_CONDITIONAL(HAVE_STATIC_LINK, test "$libgo_cv_ld_static" = yes)
 
+GCC_WITH_SYSTEM_LIBBACKTRACE
+GCC_CHECK_SYSTEM_LIBBACKTRACE
+AM_CONDITIONAL(SYSTEM_LIBBACKTRACE, [test "x$with_system_libbacktrace" = xyes])
+
 AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)
 
 AC_CACHE_SAVE
diff --git a/libgo/testsuite/Makefile.in b/libgo/testsuite/Makefile.in
index 0b5e7263dcc..d1bba0300a6 100644
--- a/libgo/testsuite/Makefile.in
+++ b/libgo/testsuite/Makefile.in
@@ -93,6 +93,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
 	$(top_srcdir)/../config/hwcaps.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
diff --git a/libphobos/Makefile.in b/libphobos/Makefile.in
index 207f66a12d5..15aac5d3182 100644
--- a/libphobos/Makefile.in
+++ b/libphobos/Makefile.in
@@ -113,6 +113,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/enable.m4 \
 	$(top_srcdir)/../config/gcc-plugin.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
diff --git a/libphobos/aclocal.m4 b/libphobos/aclocal.m4
index 68326d0b285..2a8f6df1f0a 100644
--- a/libphobos/aclocal.m4
+++ b/libphobos/aclocal.m4
@@ -878,6 +878,7 @@ m4_include([../config/clang-plugin.m4])
 m4_include([../config/enable.m4])
 m4_include([../config/gcc-plugin.m4])
 m4_include([../config/lead-dot.m4])
+m4_include([../config/libbacktrace.m4])
 m4_include([../config/multi.m4])
 m4_include([../config/override.m4])
 m4_include([../config/toolexeclibdir.m4])
diff --git a/libphobos/configure b/libphobos/configure
index 25f2608fb72..10508aeb7c7 100755
--- a/libphobos/configure
+++ b/libphobos/configure
@@ -848,6 +848,7 @@ with_gcc_major_version_only
 enable_werror
 with_libatomic
 with_libbacktrace
+with_system_libbacktrace
 with_target_system_zlib
 with_cross_host
 enable_version_specific_runtime_libs
@@ -1521,6 +1522,9 @@ Optional Packages:
   --without-libatomic     Do not use libatomic in core.atomic (default: auto)
   --without-libbacktrace  Do not use libbacktrace in core.runtime (default:
                           auto)
+  --with-system-libbacktrace
+                          link an installed libbacktrace instead of the copy
+                          in the GCC tree
   --with-target-system-zlib={yes,no,auto}
                           use installed libz (default: no)
   --with-cross-host=HOST  configuring with a cross compiler
@@ -12252,7 +12256,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12255 "configure"
+#line 12259 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12358,7 +12362,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12361 "configure"
+#line 12365 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -15582,12 +15586,49 @@ if test "${with_libbacktrace+set}" = set; then :
 fi
 
 
+
+
+# Check whether --with-system-libbacktrace was given.
+if test "${with_system_libbacktrace+set}" = set; then :
+  withval=$with_system_libbacktrace; with_system_libbacktrace=$withval
+else
+  with_system_libbacktrace=no
+fi
+
+
+    case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) as_fn_error $? "--with-system-libbacktrace does not take an argument" "$LINENO" 5 ;;
+  esac
+
+
   if test "x$enable_libbacktrace" != "xno" && test "x$with_libbacktrace" != "xno"; then :
 
-    LIBBACKTRACE=../../libbacktrace/libbacktrace.la
+
+
+  if test "x$with_system_libbacktrace" = xyes; then
+    ac_fn_c_check_header_mongrel "$LINENO" "backtrace.h" "ac_cv_header_backtrace_h" "$ac_includes_default"
+if test "x$ac_cv_header_backtrace_h" = xyes; then :
+
+else
+  as_fn_error $? "--with-system-libbacktrace given, but backtrace.h not found" "$LINENO" 5
+fi
+
+
+  fi
+
 
     gdc_save_CPPFLAGS=$CPPFLAGS
-    CPPFLAGS="$CPPFLAGS -I../libbacktrace "
+    if test "x$with_system_libbacktrace" = xyes; then :
+
+      LIBBACKTRACE=-lbacktrace
+
+else
+
+      LIBBACKTRACE=../../libbacktrace/libbacktrace.la
+      CPPFLAGS="$CPPFLAGS -I../libbacktrace "
+
+fi
 
     ac_fn_c_check_header_mongrel "$LINENO" "backtrace-supported.h" "ac_cv_header_backtrace_supported_h" "$ac_includes_default"
 if test "x$ac_cv_header_backtrace_supported_h" = xyes; then :
diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in
index 1b5b4e6e826..3cc41131446 100644
--- a/libphobos/libdruntime/Makefile.in
+++ b/libphobos/libdruntime/Makefile.in
@@ -139,6 +139,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/enable.m4 \
 	$(top_srcdir)/../config/gcc-plugin.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
diff --git a/libphobos/m4/druntime/libraries.m4 b/libphobos/m4/druntime/libraries.m4
index 8dd9c7da107..c002c837d85 100644
--- a/libphobos/m4/druntime/libraries.m4
+++ b/libphobos/m4/druntime/libraries.m4
@@ -145,11 +145,19 @@ AC_DEFUN([DRUNTIME_LIBRARIES_BACKTRACE],
     AS_HELP_STRING([--without-libbacktrace],
                    [Do not use libbacktrace in core.runtime (default: auto)]))
 
+  GCC_WITH_SYSTEM_LIBBACKTRACE
+
   AS_IF([test "x$enable_libbacktrace" != "xno" && test "x$with_libbacktrace" != "xno"], [
-    LIBBACKTRACE=../../libbacktrace/libbacktrace.la
+    dnl Only here is it settled that the library is wanted at all.
+    GCC_CHECK_SYSTEM_LIBBACKTRACE
 
     gdc_save_CPPFLAGS=$CPPFLAGS
-    CPPFLAGS="$CPPFLAGS -I../libbacktrace "
+    AS_IF([test "x$with_system_libbacktrace" = xyes], [
+      LIBBACKTRACE=-lbacktrace
+    ], [
+      LIBBACKTRACE=../../libbacktrace/libbacktrace.la
+      CPPFLAGS="$CPPFLAGS -I../libbacktrace "
+    ])
 
     AC_CHECK_HEADER(backtrace-supported.h, have_libbacktrace_h=true,
       have_libbacktrace_h=false)
diff --git a/libphobos/src/Makefile.in b/libphobos/src/Makefile.in
index c7dd55aac7b..1c7a33c8718 100644
--- a/libphobos/src/Makefile.in
+++ b/libphobos/src/Makefile.in
@@ -98,6 +98,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/enable.m4 \
 	$(top_srcdir)/../config/gcc-plugin.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
diff --git a/libphobos/testsuite/Makefile.in b/libphobos/testsuite/Makefile.in
index 2f545f9d723..8d59d4135af 100644
--- a/libphobos/testsuite/Makefile.in
+++ b/libphobos/testsuite/Makefile.in
@@ -98,6 +98,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/enable.m4 \
 	$(top_srcdir)/../config/gcc-plugin.m4 \
 	$(top_srcdir)/../config/lead-dot.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/override.m4 \
 	$(top_srcdir)/../config/toolexeclibdir.m4 \
diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
index 915e9acbf2f..a4737cca65f 100644
--- a/libstdc++-v3/Makefile.in
+++ b/libstdc++-v3/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 8c44e618cb8..3cb74846db3 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -5250,6 +5250,10 @@ AC_DEFUN([GLIBCXX_ENABLE_BACKTRACE], [
     [turns on libbacktrace support],
     [permit yes|no|auto])
 
+  GCC_WITH_SYSTEM_LIBBACKTRACE
+
+  if test "x$with_system_libbacktrace" = xno; then
+
   # Most of this is adapted from libsanitizer/configure.ac
 
   BACKTRACE_CPPFLAGS="-D_GNU_SOURCE"
@@ -5425,6 +5429,8 @@ elf64) elfsize=64 ;;
 esac
 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
 
+  fi
+
   AC_MSG_CHECKING([whether to build libbacktrace support])
   if test "$enable_libstdcxx_backtrace" = "auto"; then
     case "$host" in
@@ -5436,6 +5442,14 @@ BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
   if test "$enable_libstdcxx_backtrace" = "yes"; then
     BACKTRACE_SUPPORTED=1
 
+    if test "x$with_system_libbacktrace" = xyes; then
+
+    dnl Only here is it settled that the library is wanted at all; the option
+    dnl is parsed long before --enable-libstdcxx-backtrace=auto is resolved.
+    GCC_CHECK_SYSTEM_LIBBACKTRACE
+
+    else
+
     AC_CHECK_HEADERS(sys/mman.h)
     case "${host}" in
       *-*-msdosdjgpp) # DJGPP has sys/man.h, but no mmap
@@ -5464,6 +5478,8 @@ BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
       BACKTRACE_USES_MALLOC=1
     fi
 
+    fi
+
     if test "$ac_has_gthreads" = "yes"; then
       BACKTRACE_SUPPORTS_THREADS=1
     else
@@ -5479,7 +5495,18 @@ BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
     BACKTRACE_USES_MALLOC=0
     BACKTRACE_SUPPORTS_THREADS=0
   fi
+  # Note that GLIBCXX_CONDITIONAL will define a variable regardless of
+  # shell control flow, this is why it is worth defining all 3 of these,
+  # rather than e.g. trying to define ENABLE_SYSTEM_BACKTRACE only if
+  # ENABLE_BACKTRACE was true.
   GLIBCXX_CONDITIONAL(ENABLE_BACKTRACE, [test "$enable_libstdcxx_backtrace" = yes])
+  GLIBCXX_CONDITIONAL(ENABLE_SYSTEM_BACKTRACE,
+    [test "$enable_libstdcxx_backtrace" = yes \
+       && test "x$with_system_libbacktrace" = xyes])
+  dnl Use ../libbacktrace
+  GLIBCXX_CONDITIONAL(ENABLE_VENDORED_BACKTRACE,
+    [test "$enable_libstdcxx_backtrace" = yes \
+       && test "x$with_system_libbacktrace" = xno])
 ])
 
 dnl
diff --git a/libstdc++-v3/aclocal.m4 b/libstdc++-v3/aclocal.m4
index 0a19b02bf07..d7041264552 100644
--- a/libstdc++-v3/aclocal.m4
+++ b/libstdc++-v3/aclocal.m4
@@ -863,6 +863,7 @@ m4_include([../config/lead-dot.m4])
 m4_include([../config/lib-ld.m4])
 m4_include([../config/lib-link.m4])
 m4_include([../config/lib-prefix.m4])
+m4_include([../config/libbacktrace.m4])
 m4_include([../config/lthostflags.m4])
 m4_include([../config/multi.m4])
 m4_include([../config/no-executables.m4])
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 577640fcb75..adcb261679f 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -678,6 +678,10 @@ BUILD_INFO_TRUE
 USE_STATIC_TZDATA_FALSE
 USE_STATIC_TZDATA_TRUE
 EH_POOL_FLAGS
+ENABLE_VENDORED_BACKTRACE_FALSE
+ENABLE_VENDORED_BACKTRACE_TRUE
+ENABLE_SYSTEM_BACKTRACE_FALSE
+ENABLE_SYSTEM_BACKTRACE_TRUE
 ENABLE_BACKTRACE_FALSE
 ENABLE_BACKTRACE_TRUE
 BACKTRACE_SUPPORTS_THREADS
@@ -968,6 +972,7 @@ with_default_libstdcxx_abi
 enable_libstdcxx_threads
 enable_libstdcxx_filesystem_ts
 enable_libstdcxx_backtrace
+with_system_libbacktrace
 enable_libstdcxx_static_eh_pool
 with_libstdcxx_eh_pool_obj_count
 with_libstdcxx_zoneinfo
@@ -1715,6 +1720,9 @@ Optional Packages:
   --with-system-libunwind use installed libunwind
   --with-default-libstdcxx-abi
                           set the std::string ABI to use by default
+  --with-system-libbacktrace
+                          link an installed libbacktrace instead of the copy
+                          in the GCC tree
   --with-libstdcxx-eh-pool-obj-count
                           the number of exceptions that can be allocated from
                           the pool if malloc fails
@@ -12679,7 +12687,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12682 "configure"
+#line 12690 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12785,7 +12793,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12788 "configure"
+#line 12796 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16475,7 +16483,7 @@ $as_echo "$glibcxx_cv_atomic_word" >&6; }
     # Fake what AC_COMPILE_IFELSE does.
 
     cat > conftest.$ac_ext << EOF
-#line 16478 "configure"
+#line 16486 "configure"
 #include "atomic_word.h"
 int main()
 {
@@ -16622,7 +16630,7 @@ $as_echo "mutex" >&6; }
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 16625 "configure"
+#line 16633 "configure"
 int main()
 {
   _Decimal32 d1;
@@ -16663,7 +16671,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
   # unnecessary for this test.
 
   cat > conftest.$ac_ext << EOF
-#line 16666 "configure"
+#line 16674 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -53669,6 +53677,24 @@ fi
 
 
 
+
+
+# Check whether --with-system-libbacktrace was given.
+if test "${with_system_libbacktrace+set}" = set; then :
+  withval=$with_system_libbacktrace; with_system_libbacktrace=$withval
+else
+  with_system_libbacktrace=no
+fi
+
+
+    case "$with_system_libbacktrace" in
+    yes|no) ;;
+    *) as_fn_error $? "--with-system-libbacktrace does not take an argument" "$LINENO" 5 ;;
+  esac
+
+
+  if test "x$with_system_libbacktrace" = xno; then
+
   # Most of this is adapted from libsanitizer/configure.ac
 
   BACKTRACE_CPPFLAGS="-D_GNU_SOURCE"
@@ -53737,7 +53763,7 @@ $as_echo "$glibcxx_cv_libbacktrace_atomics" >&6; }
     CXXFLAGS='-O0 -S'
 
     cat > conftest.$ac_ext << EOF
-#line 53740 "configure"
+#line 53766 "configure"
 #include <stddef.h>
 int main()
 {
@@ -54017,6 +54043,8 @@ elf64) elfsize=64 ;;
 esac
 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
 
+  fi
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build libbacktrace support" >&5
 $as_echo_n "checking whether to build libbacktrace support... " >&6; }
   if test "$enable_libstdcxx_backtrace" = "auto"; then
@@ -54030,6 +54058,24 @@ $as_echo "$enable_libstdcxx_backtrace" >&6; }
   if test "$enable_libstdcxx_backtrace" = "yes"; then
     BACKTRACE_SUPPORTED=1
 
+    if test "x$with_system_libbacktrace" = xyes; then
+
+
+
+  if test "x$with_system_libbacktrace" = xyes; then
+    ac_fn_c_check_header_mongrel "$LINENO" "backtrace.h" "ac_cv_header_backtrace_h" "$ac_includes_default"
+if test "x$ac_cv_header_backtrace_h" = xyes; then :
+
+else
+  as_fn_error $? "--with-system-libbacktrace given, but backtrace.h not found" "$LINENO" 5
+fi
+
+
+  fi
+
+
+    else
+
     for ac_header in sys/mman.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
@@ -54078,6 +54124,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext
       BACKTRACE_USES_MALLOC=1
     fi
 
+    fi
+
     if test "$ac_has_gthreads" = "yes"; then
       BACKTRACE_SUPPORTS_THREADS=1
     else
@@ -54095,6 +54143,12 @@ $as_echo "#define HAVE_STACKTRACE 1" >>confdefs.h
     BACKTRACE_USES_MALLOC=0
     BACKTRACE_SUPPORTS_THREADS=0
   fi
+  # Note that GLIBCXX_CONDITIONAL will define a variable regardless of
+  # shell control flow, this is why it is worth defining all 3 of these,
+  # rather than e.g. trying to define ENABLE_SYSTEM_BACKTRACE only if
+  # ENABLE_BACKTRACE was true.
+
+
 
 
 
@@ -55742,6 +55796,26 @@ else
 fi
 
 
+    if test "$enable_libstdcxx_backtrace" = yes \
+       && test "x$with_system_libbacktrace" = xyes; then
+  ENABLE_SYSTEM_BACKTRACE_TRUE=
+  ENABLE_SYSTEM_BACKTRACE_FALSE='#'
+else
+  ENABLE_SYSTEM_BACKTRACE_TRUE='#'
+  ENABLE_SYSTEM_BACKTRACE_FALSE=
+fi
+
+
+    if test "$enable_libstdcxx_backtrace" = yes \
+       && test "x$with_system_libbacktrace" = xno; then
+  ENABLE_VENDORED_BACKTRACE_TRUE=
+  ENABLE_VENDORED_BACKTRACE_FALSE='#'
+else
+  ENABLE_VENDORED_BACKTRACE_TRUE='#'
+  ENABLE_VENDORED_BACKTRACE_FALSE=
+fi
+
+
     if test "${embed_zoneinfo}" = yes; then
   USE_STATIC_TZDATA_TRUE=
   USE_STATIC_TZDATA_FALSE='#'
@@ -56276,6 +56350,14 @@ if test -z "${ENABLE_BACKTRACE_TRUE}" && test -z "${ENABLE_BACKTRACE_FALSE}"; th
   as_fn_error $? "conditional \"ENABLE_BACKTRACE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_SYSTEM_BACKTRACE_TRUE}" && test -z "${ENABLE_SYSTEM_BACKTRACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_SYSTEM_BACKTRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_VENDORED_BACKTRACE_TRUE}" && test -z "${ENABLE_VENDORED_BACKTRACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_VENDORED_BACKTRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${USE_STATIC_TZDATA_TRUE}" && test -z "${USE_STATIC_TZDATA_FALSE}"; then
   as_fn_error $? "conditional \"USE_STATIC_TZDATA\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in
index 39a6988d485..0f1a5387b5d 100644
--- a/libstdc++-v3/doc/Makefile.in
+++ b/libstdc++-v3/doc/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index d081481293f..ce10a24b0a5 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index db5e83803d5..55071d8b67d 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -103,6 +103,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in
index 54d8eff693b..127bcb7e61a 100644
--- a/libstdc++-v3/po/Makefile.in
+++ b/libstdc++-v3/po/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/python/Makefile.in b/libstdc++-v3/python/Makefile.in
index 105a3a64de2..2217a7616d1 100644
--- a/libstdc++-v3/python/Makefile.in
+++ b/libstdc++-v3/python/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
index 35a497a1588..b34c8fd9075 100644
--- a/libstdc++-v3/src/Makefile.am
+++ b/libstdc++-v3/src/Makefile.am
@@ -29,7 +29,7 @@ else
 filesystem_dir =
 endif
 
-if ENABLE_BACKTRACE
+if ENABLE_VENDORED_BACKTRACE
 backtrace_dir = libbacktrace
 else
 backtrace_dir =
@@ -81,7 +81,7 @@ vpath % $(top_srcdir)/src/c++26
 if ENABLE_FILESYSTEM_TS
 vpath % $(top_srcdir)/src/filesystem
 endif
-if ENABLE_BACKTRACE
+if ENABLE_VENDORED_BACKTRACE
 vpath % $(top_srcdir)/src/libbacktrace
 endif
 vpath % $(top_srcdir)/src/experimental
@@ -431,7 +431,7 @@ stamp-debug: $(foreach dir,. $(SUBDIRS),debug/$(dir)/Makefile)
 
 .SECONDARY: $(foreach dir,. $(SUBDIRS),debug/$(dir)/Makefile)
 
-if ENABLE_BACKTRACE
+if ENABLE_VENDORED_BACKTRACE
 backtrace_supported_h = $(backtrace_dir)/backtrace-supported.h
 debug_backtrace_supported_h = debug/$(backtrace_supported_h)
 $(debug_backtrace_supported_h): $(backtrace_supported_h) stamp-debug
diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
index 811d0a5ce4a..f4676db6f3d 100644
--- a/libstdc++-v3/src/Makefile.in
+++ b/libstdc++-v3/src/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
@@ -489,8 +490,8 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS)
 @ENABLE_FILESYSTEM_TS_FALSE@@GLIBCXX_HOSTED_TRUE@filesystem_dir = 
 @ENABLE_FILESYSTEM_TS_TRUE@@GLIBCXX_HOSTED_TRUE@filesystem_dir = filesystem
 @GLIBCXX_HOSTED_FALSE@filesystem_dir = 
-@ENABLE_BACKTRACE_FALSE@@GLIBCXX_HOSTED_TRUE@backtrace_dir = 
-@ENABLE_BACKTRACE_TRUE@@GLIBCXX_HOSTED_TRUE@backtrace_dir = libbacktrace
+@ENABLE_VENDORED_BACKTRACE_FALSE@@GLIBCXX_HOSTED_TRUE@backtrace_dir = 
+@ENABLE_VENDORED_BACKTRACE_TRUE@@GLIBCXX_HOSTED_TRUE@backtrace_dir = libbacktrace
 @GLIBCXX_HOSTED_FALSE@backtrace_dir = 
 @GLIBCXX_HOSTED_FALSE@experimental_dir = 
 @GLIBCXX_HOSTED_TRUE@experimental_dir = experimental
@@ -692,9 +693,9 @@ CXXLINK = \
 @GLIBCXX_BUILD_DEBUG_TRUE@STAMP_INSTALL_DEBUG = install-debug
 @GLIBCXX_BUILD_DEBUG_FALSE@CLEAN_DEBUG = 
 @GLIBCXX_BUILD_DEBUG_TRUE@CLEAN_DEBUG = debug
-@ENABLE_BACKTRACE_TRUE@backtrace_supported_h = $(backtrace_dir)/backtrace-supported.h
-@ENABLE_BACKTRACE_FALSE@debug_backtrace_supported_h = 
-@ENABLE_BACKTRACE_TRUE@debug_backtrace_supported_h = debug/$(backtrace_supported_h)
+@ENABLE_VENDORED_BACKTRACE_TRUE@backtrace_supported_h = $(backtrace_dir)/backtrace-supported.h
+@ENABLE_VENDORED_BACKTRACE_FALSE@debug_backtrace_supported_h = 
+@ENABLE_VENDORED_BACKTRACE_TRUE@debug_backtrace_supported_h = debug/$(backtrace_supported_h)
 all: all-recursive
 
 .SUFFIXES:
@@ -1031,7 +1032,7 @@ vpath % $(top_srcdir)/src/c++20
 vpath % $(top_srcdir)/src/c++23
 vpath % $(top_srcdir)/src/c++26
 @ENABLE_FILESYSTEM_TS_TRUE@vpath % $(top_srcdir)/src/filesystem
-@ENABLE_BACKTRACE_TRUE@vpath % $(top_srcdir)/src/libbacktrace
+@ENABLE_VENDORED_BACKTRACE_TRUE@vpath % $(top_srcdir)/src/libbacktrace
 vpath % $(top_srcdir)/src/experimental
 @[email protected]: compatibility-ldbl.cc
 @GLIBCXX_LDBL_COMPAT_TRUE@	$(LTCXXCOMPILE64) $(LONG_DOUBLE_COMPAT_FLAGS) -c $<
@@ -1154,8 +1155,8 @@ stamp-debug: $(foreach dir,. $(SUBDIRS),debug/$(dir)/Makefile)
 	date > stamp-debug;
 
 .SECONDARY: $(foreach dir,. $(SUBDIRS),debug/$(dir)/Makefile)
-@ENABLE_BACKTRACE_TRUE@$(debug_backtrace_supported_h): $(backtrace_supported_h) stamp-debug
-@ENABLE_BACKTRACE_TRUE@	cp $< $@
+@ENABLE_VENDORED_BACKTRACE_TRUE@$(debug_backtrace_supported_h): $(backtrace_supported_h) stamp-debug
+@ENABLE_VENDORED_BACKTRACE_TRUE@	cp $< $@
 
 build-debug: stamp-debug $(debug_backtrace_supported_h)
 	  $(MAKE) -C debug CXXFLAGS='$(DEBUG_FLAGS)' \
diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in
index bd684bb4209..729dd90c7f7 100644
--- a/libstdc++-v3/src/c++11/Makefile.in
+++ b/libstdc++-v3/src/c++11/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/c++17/Makefile.in b/libstdc++-v3/src/c++17/Makefile.in
index 6dff0d9491d..e694945860d 100644
--- a/libstdc++-v3/src/c++17/Makefile.in
+++ b/libstdc++-v3/src/c++17/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/c++20/Makefile.in b/libstdc++-v3/src/c++20/Makefile.in
index 067419d2e48..cbd2e3c1bcf 100644
--- a/libstdc++-v3/src/c++20/Makefile.in
+++ b/libstdc++-v3/src/c++20/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am
index 92691c502a9..8a8f676e469 100644
--- a/libstdc++-v3/src/c++23/Makefile.am
+++ b/libstdc++-v3/src/c++23/Makefile.am
@@ -141,6 +141,14 @@ AM_CXXFLAGS = \
 	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
 	-fimplicit-templates
 
+if ENABLE_VENDORED_BACKTRACE
+# stacktrace.cc declares and calls libbacktrace's entry points by their
+# ordinary names.  But when we build the vendored copy as part of this
+# library, we want to rename to avoid collisions downstream. Include
+# this header on ourselves, too, for this reason.
+AM_CXXFLAGS += -include $(top_srcdir)/src/libbacktrace/backtrace-rename.h
+endif
+
 AM_MAKEFLAGS = \
 	"gxx_include_dir=$(gxx_include_dir)"
 
diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in
index 0ce93f812d2..d7f7cb7d2e0 100644
--- a/libstdc++-v3/src/c++23/Makefile.in
+++ b/libstdc++-v3/src/c++23/Makefile.in
@@ -90,6 +90,12 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
+
+# stacktrace.cc declares and calls libbacktrace's entry points by their
+# ordinary names.  But when we build the vendored copy as part of this
+# library, we want to rename to avoid collisions downstream. Include
+# this header on ourselves, too, for this reason.
+@ENABLE_VENDORED_BACKTRACE_TRUE@am__append_1 = -include $(top_srcdir)/src/libbacktrace/backtrace-rename.h
 subdir = src/c++23
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
@@ -103,6 +109,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
@@ -491,13 +498,10 @@ MODULES_FLAGS = -isystem ${glibcxx_srcdir}/include/backward -fmodules \
 # set this option because CONFIG_CXXFLAGS has to be after
 # OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
 # as the occasion calls for it.
-AM_CXXFLAGS = \
-	-std=gnu++23 \
-	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
-	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
-	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
-	-fimplicit-templates
-
+AM_CXXFLAGS = -std=gnu++23 $(glibcxx_lt_pic_flag) \
+	$(glibcxx_compiler_shared_flag) $(XTEMPLATE_FLAGS) \
+	$(VTV_CXXFLAGS) $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) \
+	$(CONFIG_CXXFLAGS) -fimplicit-templates $(am__append_1)
 AM_MAKEFLAGS = \
 	"gxx_include_dir=$(gxx_include_dir)"
 
diff --git a/libstdc++-v3/src/c++23/stacktrace.cc b/libstdc++-v3/src/c++23/stacktrace.cc
index 10cfa44e4f5..9628e6a1bdd 100644
--- a/libstdc++-v3/src/c++23/stacktrace.cc
+++ b/libstdc++-v3/src/c++23/stacktrace.cc
@@ -25,29 +25,29 @@
 #include <cstdlib>
 
 #ifdef __cpp_lib_stacktrace // C++ >= 23 && hosted && HAVE_STACKTRACE
-struct __glibcxx_backtrace_state;
+struct backtrace_state;
 
 extern "C"
 {
-__glibcxx_backtrace_state*
-__glibcxx_backtrace_create_state(const char*, int,
+backtrace_state*
+backtrace_create_state(const char*, int,
 				 void(*)(void*, const char*, int),
 				 void*);
 
 int
-__glibcxx_backtrace_simple(__glibcxx_backtrace_state*, int,
+backtrace_simple(backtrace_state*, int,
 			   int (*) (void*, __UINTPTR_TYPE__),
 			   void(*)(void*, const char*, int),
 			   void*);
 int
-__glibcxx_backtrace_pcinfo(__glibcxx_backtrace_state*, __UINTPTR_TYPE__,
+backtrace_pcinfo(backtrace_state*, __UINTPTR_TYPE__,
 			   int (*)(void*, __UINTPTR_TYPE__,
 				   const char*, int, const char*),
 			   void(*)(void*, const char*, int),
 			   void*);
 
 int
-__glibcxx_backtrace_syminfo(__glibcxx_backtrace_state*, __UINTPTR_TYPE__ addr,
+backtrace_syminfo(backtrace_state*, __UINTPTR_TYPE__ addr,
 			    void (*) (void*, __UINTPTR_TYPE__, const char*,
 				      __UINTPTR_TYPE__, __UINTPTR_TYPE__),
 			    void(*)(void*, const char*, int),
@@ -83,14 +83,14 @@ namespace
   err_handler(void*, const char*, int)
   { }
 
-  __glibcxx_backtrace_state*
+  backtrace_state*
   init()
   {
 #if __GTHREADS && ! defined(__cpp_threadsafe_static_init)
 # warning "std::stacktrace initialization will not be thread-safe"
 #endif
-    static __glibcxx_backtrace_state* state
-      = __glibcxx_backtrace_create_state(nullptr, 1, err_handler, nullptr);
+    static backtrace_state* state
+      = backtrace_create_state(nullptr, 1, err_handler, nullptr);
     return state;
   }
 }
@@ -134,7 +134,7 @@ stacktrace_entry::_Info::_M_populate(native_handle_type pc)
     return function != nullptr;
   };
   const auto state = init();
-  if (::__glibcxx_backtrace_pcinfo(state, pc, +cb, err_handler, this))
+  if (::backtrace_pcinfo(state, pc, +cb, err_handler, this))
     return true;
 
   // If we get here then backtrace_pcinfo did not give us a function name.
@@ -146,7 +146,7 @@ stacktrace_entry::_Info::_M_populate(native_handle_type pc)
       {
 	static_cast<_Info*>(self)->_M_set_desc(symname);
       };
-      if (::__glibcxx_backtrace_syminfo(state, pc, +cb2, err_handler, this))
+      if (::backtrace_syminfo(state, pc, +cb2, err_handler, this))
 	return true;
     }
   return false;
@@ -162,7 +162,7 @@ __stacktrace_impl::_S_current(int (*cb) (void*, __UINTPTR_TYPE__), void* obj,
 {
   const auto state = init();
   // skip+2 because we don't want this function or its caller to be included.
-  int r = ::__glibcxx_backtrace_simple(state, skip + 2, cb, err_handler, obj);
+  int r = ::backtrace_simple(state, skip + 2, cb, err_handler, obj);
   // Could also use this to prevent tail-call optim: __asm ("" : "+g" (r));
   return r;
 }
diff --git a/libstdc++-v3/src/c++26/Makefile.in b/libstdc++-v3/src/c++26/Makefile.in
index 13c3a03b236..b75efc25736 100644
--- a/libstdc++-v3/src/c++26/Makefile.in
+++ b/libstdc++-v3/src/c++26/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/c++98/Makefile.in b/libstdc++-v3/src/c++98/Makefile.in
index c8df597f40d..353622ab039 100644
--- a/libstdc++-v3/src/c++98/Makefile.in
+++ b/libstdc++-v3/src/c++98/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/experimental/Makefile.am b/libstdc++-v3/src/experimental/Makefile.am
index bad10b40e21..ac4a60e202c 100644
--- a/libstdc++-v3/src/experimental/Makefile.am
+++ b/libstdc++-v3/src/experimental/Makefile.am
@@ -31,9 +31,16 @@ filesystem_lib =
 endif
 
 if ENABLE_BACKTRACE
+if ENABLE_SYSTEM_BACKTRACE
+backtrace_lib = -lbacktrace
+backtrace_dep =
+else
 backtrace_lib = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
+backtrace_dep = $(backtrace_lib)
+endif
 else
 backtrace_lib =
+backtrace_dep =
 endif
 
 headers =
@@ -59,7 +66,7 @@ libstdc__exp_la_LIBADD = \
 libstdc__exp_la_DEPENDENCIES = \
 	$(top_builddir)/src/c++23/libc++23convenience.la \
 	$(top_builddir)/src/c++26/libc++26convenience.la \
-	$(filesystem_lib) $(backtrace_lib)
+	$(filesystem_lib) $(backtrace_dep)
 
 # AM_CXXFLAGS needs to be in each subdirectory so that it can be
 # modified in a per-library or per-sub-library way.  Need to manually
diff --git a/libstdc++-v3/src/experimental/Makefile.in b/libstdc++-v3/src/experimental/Makefile.in
index a9248197f8c..e2ad644bed1 100644
--- a/libstdc++-v3/src/experimental/Makefile.in
+++ b/libstdc++-v3/src/experimental/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
@@ -151,7 +152,7 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
 LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
 @ENABLE_FILESYSTEM_TS_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/src/filesystem/libstdc++fsconvenience.la
-@ENABLE_BACKTRACE_TRUE@am__DEPENDENCIES_2 = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
+@ENABLE_BACKTRACE_TRUE@@ENABLE_SYSTEM_BACKTRACE_FALSE@am__DEPENDENCIES_2 = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
 am__objects_1 = contract26.lo
 am_libstdc__exp_la_OBJECTS = $(am__objects_1)
 libstdc__exp_la_OBJECTS = $(am_libstdc__exp_la_OBJECTS)
@@ -455,7 +456,11 @@ toolexeclib_LTLIBRARIES = libstdc++exp.la
 @ENABLE_FILESYSTEM_TS_FALSE@filesystem_lib = 
 @ENABLE_FILESYSTEM_TS_TRUE@filesystem_lib = $(top_builddir)/src/filesystem/libstdc++fsconvenience.la
 @ENABLE_BACKTRACE_FALSE@backtrace_lib = 
-@ENABLE_BACKTRACE_TRUE@backtrace_lib = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
+@ENABLE_BACKTRACE_TRUE@@ENABLE_SYSTEM_BACKTRACE_FALSE@backtrace_lib = $(top_builddir)/src/libbacktrace/libstdc++_libbacktrace.la
+@ENABLE_BACKTRACE_TRUE@@ENABLE_SYSTEM_BACKTRACE_TRUE@backtrace_lib = -lbacktrace
+@ENABLE_BACKTRACE_FALSE@backtrace_dep = 
+@ENABLE_BACKTRACE_TRUE@@ENABLE_SYSTEM_BACKTRACE_FALSE@backtrace_dep = $(backtrace_lib)
+@ENABLE_BACKTRACE_TRUE@@ENABLE_SYSTEM_BACKTRACE_TRUE@backtrace_dep = 
 headers = 
 sources = \
 	contract26.cc
@@ -469,7 +474,7 @@ libstdc__exp_la_LIBADD = \
 libstdc__exp_la_DEPENDENCIES = \
 	$(top_builddir)/src/c++23/libc++23convenience.la \
 	$(top_builddir)/src/c++26/libc++26convenience.la \
-	$(filesystem_lib) $(backtrace_lib)
+	$(filesystem_lib) $(backtrace_dep)
 
 
 # AM_CXXFLAGS needs to be in each subdirectory so that it can be
diff --git a/libstdc++-v3/src/filesystem/Makefile.in b/libstdc++-v3/src/filesystem/Makefile.in
index b138a079deb..8ef1bb76e07 100644
--- a/libstdc++-v3/src/filesystem/Makefile.in
+++ b/libstdc++-v3/src/filesystem/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/src/libbacktrace/Makefile.in b/libstdc++-v3/src/libbacktrace/Makefile.in
index 6ce97c43395..0a798157e5c 100644
--- a/libstdc++-v3/src/libbacktrace/Makefile.in
+++ b/libstdc++-v3/src/libbacktrace/Makefile.in
@@ -133,6 +133,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
index 3aed09d1049..49e6e4903c9 100644
--- a/libstdc++-v3/testsuite/Makefile.in
+++ b/libstdc++-v3/testsuite/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/lib-ld.m4 \
 	$(top_srcdir)/../config/lib-link.m4 \
 	$(top_srcdir)/../config/lib-prefix.m4 \
+	$(top_srcdir)/../config/libbacktrace.m4 \
 	$(top_srcdir)/../config/lthostflags.m4 \
 	$(top_srcdir)/../config/multi.m4 \
 	$(top_srcdir)/../config/no-executables.m4 \
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.