https://gcc.gnu.org/g:8858cb3a6af52e4425d1635a7666d3f3658005d5

commit r17-3835-g8858cb3a6af52e4425d1635a7666d3f3658005d5
Author: Ian Lance Taylor <[email protected]>
Date:   Tue Sep 1 15:08:41 2026 -0700

    libbacktrace: handle MOREDATA correctly without debug info
    
    Based on patch from Andi Kleen.
    
            * elf.c (elf_nodebug): Handle state->moredata.
            * fileline.c (backtrace_syminfo_to_full_callback): Remove
            incorrect comment about MOREDATA.
            (backtrace_syminfo_to_full_callback_moredata): New function.
            * internal.h (backtrace_syminfo_to_full_callback_moredata):
            Declare.
            * strippedtest.c: New file.
            * configure.ac: check whether objcopy supports --strip-debug.
            * Makefile.am (strippedtest_SOURCES): New variable.
            (strippedtest_CFLAGS, strippedtest_LDFLAGS): Likewise.
            (strippedtest_LDADD): Likewise.
            (check_PROGRAMS): Add strippedtest.
            (MAKETESTS): Add strippedtest_stripped
            (%_stripped): New rule.
            * configure, Makefile.in: Regenerate.

Diff:
---
 libbacktrace/Makefile.am    |  17 ++++
 libbacktrace/Makefile.in    | 196 ++++++++++++++++++++++++----------------
 libbacktrace/configure      |  37 +++++++-
 libbacktrace/configure.ac   |  14 +++
 libbacktrace/elf.c          |  10 ++-
 libbacktrace/fileline.c     |  24 ++++-
 libbacktrace/internal.h     |   9 ++
 libbacktrace/strippedtest.c | 215 ++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 437 insertions(+), 85 deletions(-)

diff --git a/libbacktrace/Makefile.am b/libbacktrace/Makefile.am
index c7bdd516016b..af0ef151cd95 100644
--- a/libbacktrace/Makefile.am
+++ b/libbacktrace/Makefile.am
@@ -132,6 +132,23 @@ libbacktrace_noformat_la_LIBADD = $(BACKTRACE_FILE) 
$(VIEW_FILE) $(ALLOC_FILE)
 
 libbacktrace_noformat_la_DEPENDENCIES = $(libbacktrace_noformat_la_LIBADD)
 
+if HAVE_ELF
+if HAVE_OBJCOPY_STRIPDEBUG
+
+strippedtest_SOURCES = strippedtest.c testlib.c
+strippedtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
+strippedtest_LDFLAGS = $(libbacktrace_testing_ldflags) -static -Wl,-Bstatic
+strippedtest_LDADD = libbacktrace.la
+
+check_PROGRAMS += strippedtest
+MAKETESTS += strippedtest_stripped
+
+%_stripped: %
+       $(OBJCOPY) --strip-debug $< $@
+
+endif HAVE_OBJCOPY_STRIPDEBUG
+endif HAVE_ELF
+
 if HAVE_ELF
 if HAVE_OBJCOPY_DEBUGLINK
 
diff --git a/libbacktrace/Makefile.in b/libbacktrace/Makefile.in
index 7530c1d4daa6..076603e9d9f7 100644
--- a/libbacktrace/Makefile.in
+++ b/libbacktrace/Makefile.in
@@ -121,53 +121,55 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
-       $(am__EXEEXT_4) $(am__EXEEXT_17)
-TESTS = $(am__append_4) $(MAKETESTS) $(am__EXEEXT_17)
-@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_1 = 
libbacktrace_elf_for_test.la
-@NATIVE_TRUE@am__append_2 = test_elf_32 test_elf_64 test_macho \
+       $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_18)
+TESTS = $(am__append_6) $(MAKETESTS) $(am__EXEEXT_18)
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@am__append_1 = 
strippedtest
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@am__append_2 = 
strippedtest_stripped
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_3 = 
libbacktrace_elf_for_test.la
+@NATIVE_TRUE@am__append_4 = test_elf_32 test_elf_64 test_macho \
 @NATIVE_TRUE@  test_xcoff_32 test_xcoff_64 test_pecoff \
 @NATIVE_TRUE@  test_unknown unittest unittest_alloc btest
-@NATIVE_TRUE@am__append_3 = allocfail
-@NATIVE_TRUE@am__append_4 = allocfail.sh
-@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_5 = allocfail.dSYM \
+@NATIVE_TRUE@am__append_5 = allocfail
+@NATIVE_TRUE@am__append_6 = allocfail.sh
+@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_7 = allocfail.dSYM \
 @NATIVE_TRUE@@USE_DSYMUTIL_TRUE@       btest.dSYM btest_alloc.dSYM \
 @NATIVE_TRUE@@USE_DSYMUTIL_TRUE@       stest.dSYM stest_alloc.dSYM \
 @NATIVE_TRUE@@USE_DSYMUTIL_TRUE@       edtest.dSYM edtest_alloc.dSYM
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_6
 = b2test
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_7
 = b2test_buildid b2test_buildidfull
-@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_8
 = b3test
-@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_9
 = b3test_dwz_buildid b3test_dwz_buildidfull
-@HAVE_ELF_TRUE@@NATIVE_TRUE@am__append_10 = btest_lto
-@NATIVE_TRUE@am__append_11 = btest_alloc mdtest stest stest_alloc
-@HAVE_DWZ_TRUE@@NATIVE_TRUE@am__append_12 = btest_dwz
-@HAVE_DWZ_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_13 = 
btest_dwz_gnudebuglink
-@HAVE_ELF_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_TRUE@am__append_14 = -lz
-@HAVE_ELF_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_TRUE@am__append_15 = -lz
-@HAVE_ELF_TRUE@@NATIVE_TRUE@am__append_16 = ztest ztest_alloc zstdtest \
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_8
 = b2test
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_9
 = b2test_buildid b2test_buildidfull
+@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_10
 = b3test
+@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_11
 = b3test_dwz_buildid b3test_dwz_buildidfull
+@HAVE_ELF_TRUE@@NATIVE_TRUE@am__append_12 = btest_lto
+@NATIVE_TRUE@am__append_13 = btest_alloc mdtest stest stest_alloc
+@HAVE_DWZ_TRUE@@NATIVE_TRUE@am__append_14 = btest_dwz
+@HAVE_DWZ_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_15 = 
btest_dwz_gnudebuglink
+@HAVE_ELF_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_TRUE@am__append_16 = -lz
+@HAVE_ELF_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_TRUE@am__append_17 = -lz
+@HAVE_ELF_TRUE@@NATIVE_TRUE@am__append_18 = ztest ztest_alloc zstdtest \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   zstdtest_alloc
-@HAVE_ELF_TRUE@@HAVE_ZSTD_TRUE@@NATIVE_TRUE@am__append_17 = -lzstd
-@HAVE_ELF_TRUE@@HAVE_ZSTD_TRUE@@NATIVE_TRUE@am__append_18 = -lzstd
-@NATIVE_TRUE@am__append_19 = edtest edtest_alloc
-@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@am__append_20 = ttest ttest_alloc
-@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_21 =  \
+@HAVE_ELF_TRUE@@HAVE_ZSTD_TRUE@@NATIVE_TRUE@am__append_19 = -lzstd
+@HAVE_ELF_TRUE@@HAVE_ZSTD_TRUE@@NATIVE_TRUE@am__append_20 = -lzstd
+@NATIVE_TRUE@am__append_21 = edtest edtest_alloc
+@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@am__append_22 = ttest ttest_alloc
+@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_23 =  \
 @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@    ttest.dSYM \
 @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@    ttest_alloc.dSYM
-@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_22 = btest_gnudebuglink 
btest_gnudebuglinkfull
-@HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@am__append_23 = ctestg 
ctestg_alloc
-@HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@am__append_24 = ctesta 
ctesta_alloc
-@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__append_25 = ctestzstd 
ctestzstd_alloc
-@HAVE_DWARF5_TRUE@@NATIVE_TRUE@am__append_26 = dwarf5 dwarf5_alloc
-@HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_27 =  \
+@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_24 = btest_gnudebuglink 
btest_gnudebuglinkfull
+@HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@am__append_25 = ctestg 
ctestg_alloc
+@HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@am__append_26 = ctesta 
ctesta_alloc
+@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__append_27 = ctestzstd 
ctestzstd_alloc
+@HAVE_DWARF5_TRUE@@NATIVE_TRUE@am__append_28 = dwarf5 dwarf5_alloc
+@HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_29 =  \
 @HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@     dwarf5.dSYM \
 @HAVE_DWARF5_TRUE@@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@     dwarf5_alloc.dSYM
-@NATIVE_TRUE@am__append_28 = mtest
-@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_29 = mtest.dSYM
-@HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@am__append_30 = mtest_minidebug
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_31
 = m2test
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_32
 = m2test_minidebug2
-@HAVE_ELF_TRUE@@HAVE_LIBLZMA_TRUE@am__append_33 = -llzma
-@HAVE_ELF_TRUE@@HAVE_LIBLZMA_TRUE@am__append_34 = -llzma
-@HAVE_ELF_TRUE@am__append_35 = xztest xztest_alloc
+@NATIVE_TRUE@am__append_30 = mtest
+@NATIVE_TRUE@@USE_DSYMUTIL_TRUE@am__append_31 = mtest.dSYM
+@HAVE_MINIDEBUG_TRUE@@NATIVE_TRUE@am__append_32 = mtest_minidebug
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_33
 = m2test
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__append_34
 = m2test_minidebug2
+@HAVE_ELF_TRUE@@HAVE_LIBLZMA_TRUE@am__append_35 = -llzma
+@HAVE_ELF_TRUE@@HAVE_LIBLZMA_TRUE@am__append_36 = -llzma
+@HAVE_ELF_TRUE@am__append_37 = xztest xztest_alloc
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/../config/cet.m4 \
@@ -225,39 +227,40 @@ libbacktrace_instrumented_alloc_la_OBJECTS =  \
 libbacktrace_noformat_la_OBJECTS =  \
        $(am_libbacktrace_noformat_la_OBJECTS)
 @NATIVE_TRUE@am_libbacktrace_noformat_la_rpath =
-@NATIVE_TRUE@am__EXEEXT_1 = allocfail$(EXEEXT)
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_2
 = b2test$(EXEEXT)
-@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_3
 = b3test$(EXEEXT)
-@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_4
 = m2test$(EXEEXT)
-@NATIVE_TRUE@am__EXEEXT_5 = test_elf_32$(EXEEXT) test_elf_64$(EXEEXT) \
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@am__EXEEXT_1 = 
strippedtest$(EXEEXT)
+@NATIVE_TRUE@am__EXEEXT_2 = allocfail$(EXEEXT)
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_3
 = b2test$(EXEEXT)
+@HAVE_BUILDID_TRUE@@HAVE_DWZ_TRUE@@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_4
 = b3test$(EXEEXT)
+@HAVE_BUILDID_TRUE@@HAVE_ELF_TRUE@@HAVE_MINIDEBUG_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@am__EXEEXT_5
 = m2test$(EXEEXT)
+@NATIVE_TRUE@am__EXEEXT_6 = test_elf_32$(EXEEXT) test_elf_64$(EXEEXT) \
 @NATIVE_TRUE@  test_macho$(EXEEXT) test_xcoff_32$(EXEEXT) \
 @NATIVE_TRUE@  test_xcoff_64$(EXEEXT) test_pecoff$(EXEEXT) \
 @NATIVE_TRUE@  test_unknown$(EXEEXT) unittest$(EXEEXT) \
 @NATIVE_TRUE@  unittest_alloc$(EXEEXT) btest$(EXEEXT)
-@HAVE_ELF_TRUE@@NATIVE_TRUE@am__EXEEXT_6 = btest_lto$(EXEEXT)
-@NATIVE_TRUE@am__EXEEXT_7 = btest_alloc$(EXEEXT) mdtest$(EXEEXT) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@am__EXEEXT_7 = btest_lto$(EXEEXT)
+@NATIVE_TRUE@am__EXEEXT_8 = btest_alloc$(EXEEXT) mdtest$(EXEEXT) \
 @NATIVE_TRUE@  stest$(EXEEXT) stest_alloc$(EXEEXT)
-@HAVE_ELF_TRUE@@NATIVE_TRUE@am__EXEEXT_8 = ztest$(EXEEXT) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@am__EXEEXT_9 = ztest$(EXEEXT) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   ztest_alloc$(EXEEXT) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   zstdtest$(EXEEXT) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   zstdtest_alloc$(EXEEXT)
-@NATIVE_TRUE@am__EXEEXT_9 = edtest$(EXEEXT) edtest_alloc$(EXEEXT)
-@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@am__EXEEXT_10 = ttest$(EXEEXT) \
+@NATIVE_TRUE@am__EXEEXT_10 = edtest$(EXEEXT) edtest_alloc$(EXEEXT)
+@HAVE_PTHREAD_TRUE@@NATIVE_TRUE@am__EXEEXT_11 = ttest$(EXEEXT) \
 @HAVE_PTHREAD_TRUE@@NATIVE_TRUE@       ttest_alloc$(EXEEXT)
-@HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@am__EXEEXT_11 = 
ctestg$(EXEEXT) \
+@HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@am__EXEEXT_12 = 
ctestg$(EXEEXT) \
 @HAVE_COMPRESSED_DEBUG_ZLIB_GNU_TRUE@@NATIVE_TRUE@     ctestg_alloc$(EXEEXT)
-@HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@am__EXEEXT_12 = 
ctesta$(EXEEXT) \
+@HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@am__EXEEXT_13 = 
ctesta$(EXEEXT) \
 @HAVE_COMPRESSED_DEBUG_ZLIB_GABI_TRUE@@NATIVE_TRUE@    ctesta_alloc$(EXEEXT)
-@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__EXEEXT_13 = 
ctestzstd$(EXEEXT) \
+@HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@am__EXEEXT_14 = 
ctestzstd$(EXEEXT) \
 @HAVE_COMPRESSED_DEBUG_ZSTD_TRUE@@NATIVE_TRUE@ ctestzstd_alloc$(EXEEXT)
-@HAVE_DWARF5_TRUE@@NATIVE_TRUE@am__EXEEXT_14 = dwarf5$(EXEEXT) \
+@HAVE_DWARF5_TRUE@@NATIVE_TRUE@am__EXEEXT_15 = dwarf5$(EXEEXT) \
 @HAVE_DWARF5_TRUE@@NATIVE_TRUE@        dwarf5_alloc$(EXEEXT)
-@NATIVE_TRUE@am__EXEEXT_15 = mtest$(EXEEXT)
-@HAVE_ELF_TRUE@am__EXEEXT_16 = xztest$(EXEEXT) xztest_alloc$(EXEEXT)
-am__EXEEXT_17 = $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \
-       $(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_10) \
-       $(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13) \
-       $(am__EXEEXT_14) $(am__EXEEXT_15) $(am__EXEEXT_16)
+@NATIVE_TRUE@am__EXEEXT_16 = mtest$(EXEEXT)
+@HAVE_ELF_TRUE@am__EXEEXT_17 = xztest$(EXEEXT) xztest_alloc$(EXEEXT)
+am__EXEEXT_18 = $(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8) \
+       $(am__EXEEXT_9) $(am__EXEEXT_10) $(am__EXEEXT_11) \
+       $(am__EXEEXT_12) $(am__EXEEXT_13) $(am__EXEEXT_14) \
+       $(am__EXEEXT_15) $(am__EXEEXT_16) $(am__EXEEXT_17)
 @NATIVE_TRUE@am_allocfail_OBJECTS = allocfail-allocfail.$(OBJEXT) \
 @NATIVE_TRUE@  allocfail-testlib.$(OBJEXT)
 allocfail_OBJECTS = $(am_allocfail_OBJECTS)
@@ -423,6 +426,13 @@ stest_alloc_OBJECTS = $(am_stest_alloc_OBJECTS)
 stest_alloc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(stest_alloc_CFLAGS) \
        $(CFLAGS) $(stest_alloc_LDFLAGS) $(LDFLAGS) -o $@
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@am_strippedtest_OBJECTS
 = strippedtest-strippedtest.$(OBJEXT) \
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@     
strippedtest-testlib.$(OBJEXT)
+strippedtest_OBJECTS = $(am_strippedtest_OBJECTS)
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@strippedtest_DEPENDENCIES
 = libbacktrace.la
+strippedtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(strippedtest_CFLAGS) \
+       $(CFLAGS) $(strippedtest_LDFLAGS) $(LDFLAGS) -o $@
 @NATIVE_TRUE@am_test_elf_32_OBJECTS =  \
 @NATIVE_TRUE@  test_elf_32-test_format.$(OBJEXT) \
 @NATIVE_TRUE@  test_elf_32-testlib.$(OBJEXT)
@@ -629,11 +639,11 @@ SOURCES = $(libbacktrace_la_SOURCES) 
$(EXTRA_libbacktrace_la_SOURCES) \
        $(dwarf5_alloc_SOURCES) $(edtest_SOURCES) \
        $(edtest_alloc_SOURCES) $(m2test_SOURCES) $(mdtest_SOURCES) \
        $(mtest_SOURCES) $(stest_SOURCES) $(stest_alloc_SOURCES) \
-       $(test_elf_32_SOURCES) $(test_elf_64_SOURCES) \
-       $(test_macho_SOURCES) $(test_pecoff_SOURCES) \
-       $(test_unknown_SOURCES) $(test_xcoff_32_SOURCES) \
-       $(test_xcoff_64_SOURCES) $(ttest_SOURCES) \
-       $(ttest_alloc_SOURCES) $(unittest_SOURCES) \
+       $(strippedtest_SOURCES) $(test_elf_32_SOURCES) \
+       $(test_elf_64_SOURCES) $(test_macho_SOURCES) \
+       $(test_pecoff_SOURCES) $(test_unknown_SOURCES) \
+       $(test_xcoff_32_SOURCES) $(test_xcoff_64_SOURCES) \
+       $(ttest_SOURCES) $(ttest_alloc_SOURCES) $(unittest_SOURCES) \
        $(unittest_alloc_SOURCES) $(xztest_SOURCES) \
        $(xztest_alloc_SOURCES) $(zstdtest_SOURCES) \
        $(zstdtest_alloc_SOURCES) $(ztest_SOURCES) \
@@ -1055,20 +1065,20 @@ libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
 
 # Add a test to this variable if you want it to be built as a Makefile
 # target and run.
-MAKETESTS = $(am__append_7) $(am__append_9) $(am__append_12) \
-       $(am__append_13) $(am__append_22) $(am__append_30) \
-       $(am__append_32)
+MAKETESTS = $(am__append_2) $(am__append_9) $(am__append_11) \
+       $(am__append_14) $(am__append_15) $(am__append_24) \
+       $(am__append_32) $(am__append_34)
 
 # Add a test to this variable if you want it to be built as a program,
 # with SOURCES, etc., and run.
-BUILDTESTS = $(am__append_2) $(am__append_10) $(am__append_11) \
-       $(am__append_16) $(am__append_19) $(am__append_20) \
-       $(am__append_23) $(am__append_24) $(am__append_25) \
-       $(am__append_26) $(am__append_28) $(am__append_35)
+BUILDTESTS = $(am__append_4) $(am__append_12) $(am__append_13) \
+       $(am__append_18) $(am__append_21) $(am__append_22) \
+       $(am__append_25) $(am__append_26) $(am__append_27) \
+       $(am__append_28) $(am__append_30) $(am__append_37)
 
 # Add a file to this variable if you want it to be built for testing.
-check_DATA = $(am__append_5) $(am__append_21) $(am__append_27) \
-       $(am__append_29)
+check_DATA = $(am__append_7) $(am__append_23) $(am__append_29) \
+       $(am__append_31)
 
 # Flags to use when compiling test programs.
 libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
@@ -1077,7 +1087,7 @@ libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
 # This avoids generating a shell script when configured with --enable-shared.
 libbacktrace_testing_ldflags = -no-install
 @NATIVE_TRUE@check_LTLIBRARIES = libbacktrace_alloc.la \
-@NATIVE_TRUE@  libbacktrace_noformat.la $(am__append_1) \
+@NATIVE_TRUE@  libbacktrace_noformat.la $(am__append_3) \
 @NATIVE_TRUE@  libbacktrace_instrumented_alloc.la
 @NATIVE_TRUE@libbacktrace_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
 @NATIVE_TRUE@libbacktrace_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) 
read.lo alloc.lo
@@ -1085,6 +1095,10 @@ libbacktrace_testing_ldflags = -no-install
 @NATIVE_TRUE@libbacktrace_noformat_la_SOURCES = $(libbacktrace_la_SOURCES)
 @NATIVE_TRUE@libbacktrace_noformat_la_LIBADD = $(BACKTRACE_FILE) $(VIEW_FILE) 
$(ALLOC_FILE)
 @NATIVE_TRUE@libbacktrace_noformat_la_DEPENDENCIES = 
$(libbacktrace_noformat_la_LIBADD)
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@strippedtest_SOURCES 
= strippedtest.c testlib.c
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@strippedtest_CFLAGS 
= $(libbacktrace_TEST_CFLAGS) -O
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@strippedtest_LDFLAGS 
= $(libbacktrace_testing_ldflags) -static -Wl,-Bstatic
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@strippedtest_LDADD = 
libbacktrace.la
 @HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@TEST_BUILD_ID_DIR = 
$(abs_builddir)/usr/lib/debug/.build-id/
 
@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@libbacktrace_elf_for_test_la_SOURCES
 = $(libbacktrace_la_SOURCES)
 
@HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@libbacktrace_elf_for_test_la_LIBADD
 = $(BACKTRACE_FILE) elf_for_test.lo \
@@ -1172,10 +1186,10 @@ libbacktrace_testing_ldflags = -no-install
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) 
-DSRCDIR=\"$(srcdir)\"
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_LDFLAGS = $(libbacktrace_testing_ldflags)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_LDADD = libbacktrace.la \
-@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_14) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_16) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   $(CLOCK_GETTIME_LINK)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_alloc_LDADD = libbacktrace_alloc.la \
-@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_15) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_17) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   $(CLOCK_GETTIME_LINK)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_alloc_SOURCES = $(ztest_SOURCES)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@ztest_alloc_CFLAGS = $(ztest_CFLAGS)
@@ -1184,11 +1198,11 @@ libbacktrace_testing_ldflags = -no-install
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) 
-DSRCDIR=\"$(srcdir)\"
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_LDFLAGS = $(libbacktrace_testing_ldflags)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_LDADD = libbacktrace.la \
-@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_17) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_19) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   $(CLOCK_GETTIME_LINK)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_alloc_LDADD =  \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   libbacktrace_alloc.la \
-@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_18) \
+@HAVE_ELF_TRUE@@NATIVE_TRUE@   $(am__append_20) \
 @HAVE_ELF_TRUE@@NATIVE_TRUE@   $(CLOCK_GETTIME_LINK)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_alloc_SOURCES = $(zstdtest_SOURCES)
 @HAVE_ELF_TRUE@@NATIVE_TRUE@zstdtest_alloc_CFLAGS = $(zstdtest_CFLAGS)
@@ -1252,13 +1266,13 @@ libbacktrace_testing_ldflags = -no-install
 @HAVE_ELF_TRUE@xztest_SOURCES = xztest.c testlib.c
 @HAVE_ELF_TRUE@xztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) 
-DSRCDIR=\"$(srcdir)\"
 @HAVE_ELF_TRUE@xztest_LDFLAGS = $(libbacktrace_testing_ldflags)
-@HAVE_ELF_TRUE@xztest_LDADD = libbacktrace.la $(am__append_33) \
+@HAVE_ELF_TRUE@xztest_LDADD = libbacktrace.la $(am__append_35) \
 @HAVE_ELF_TRUE@        $(CLOCK_GETTIME_LINK)
 @HAVE_ELF_TRUE@xztest_alloc_SOURCES = $(xztest_SOURCES)
 @HAVE_ELF_TRUE@xztest_alloc_CFLAGS = $(xztest_CFLAGS)
 @HAVE_ELF_TRUE@xztest_alloc_LDFLAGS = $(libbacktrace_testing_ldflags)
 @HAVE_ELF_TRUE@xztest_alloc_LDADD = libbacktrace_alloc.la \
-@HAVE_ELF_TRUE@        $(am__append_34) $(CLOCK_GETTIME_LINK)
+@HAVE_ELF_TRUE@        $(am__append_36) $(CLOCK_GETTIME_LINK)
 CLEANFILES = \
        $(MAKETESTS) $(BUILDTESTS) *.debug elf_for_test.c edtest2_build.c \
        gen_edtest2_build \
@@ -1473,6 +1487,10 @@ stest_alloc$(EXEEXT): $(stest_alloc_OBJECTS) 
$(stest_alloc_DEPENDENCIES) $(EXTRA
        @rm -f stest_alloc$(EXEEXT)
        $(AM_V_CCLD)$(stest_alloc_LINK) $(stest_alloc_OBJECTS) 
$(stest_alloc_LDADD) $(LIBS)
 
+strippedtest$(EXEEXT): $(strippedtest_OBJECTS) $(strippedtest_DEPENDENCIES) 
$(EXTRA_strippedtest_DEPENDENCIES) 
+       @rm -f strippedtest$(EXEEXT)
+       $(AM_V_CCLD)$(strippedtest_LINK) $(strippedtest_OBJECTS) 
$(strippedtest_LDADD) $(LIBS)
+
 test_elf_32$(EXEEXT): $(test_elf_32_OBJECTS) $(test_elf_32_DEPENDENCIES) 
$(EXTRA_test_elf_32_DEPENDENCIES) 
        @rm -f test_elf_32$(EXEEXT)
        $(AM_V_CCLD)$(test_elf_32_LINK) $(test_elf_32_OBJECTS) 
$(test_elf_32_LDADD) $(LIBS)
@@ -1808,6 +1826,18 @@ stest_alloc-stest.o: stest.c
 stest_alloc-stest.obj: stest.c
        $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(stest_alloc_CFLAGS) $(CFLAGS) -c -o stest_alloc-stest.obj `if 
test -f 'stest.c'; then $(CYGPATH_W) 'stest.c'; else $(CYGPATH_W) 
'$(srcdir)/stest.c'; fi`
 
+strippedtest-strippedtest.o: strippedtest.c
+       $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(strippedtest_CFLAGS) $(CFLAGS) -c -o strippedtest-strippedtest.o 
`test -f 'strippedtest.c' || echo '$(srcdir)/'`strippedtest.c
+
+strippedtest-strippedtest.obj: strippedtest.c
+       $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(strippedtest_CFLAGS) $(CFLAGS) -c -o 
strippedtest-strippedtest.obj `if test -f 'strippedtest.c'; then $(CYGPATH_W) 
'strippedtest.c'; else $(CYGPATH_W) '$(srcdir)/strippedtest.c'; fi`
+
+strippedtest-testlib.o: testlib.c
+       $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(strippedtest_CFLAGS) $(CFLAGS) -c -o strippedtest-testlib.o `test 
-f 'testlib.c' || echo '$(srcdir)/'`testlib.c
+
+strippedtest-testlib.obj: testlib.c
+       $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(strippedtest_CFLAGS) $(CFLAGS) -c -o strippedtest-testlib.obj `if 
test -f 'testlib.c'; then $(CYGPATH_W) 'testlib.c'; else $(CYGPATH_W) 
'$(srcdir)/testlib.c'; fi`
+
 test_elf_32-test_format.o: test_format.c
        $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) 
$(CPPFLAGS) $(test_elf_32_CFLAGS) $(CFLAGS) -c -o test_elf_32-test_format.o 
`test -f 'test_format.c' || echo '$(srcdir)/'`test_format.c
 
@@ -2228,6 +2258,13 @@ allocfail.sh.log: allocfail.sh
        --log-file $$b.log --trs-file $$b.trs \
        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) 
-- $(LOG_COMPILE) \
        "$$tst" $(AM_TESTS_FD_REDIRECT)
+strippedtest_stripped.log: strippedtest_stripped
+       @p='strippedtest_stripped'; \
+       b='strippedtest_stripped'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) 
-- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
 b2test_buildid.log: b2test_buildid
        @p='b2test_buildid'; \
        b='b2test_buildid'; \
@@ -2690,6 +2727,9 @@ uninstall-am:
 @USE_DSYMUTIL_TRUE@%.dSYM: %
 @USE_DSYMUTIL_TRUE@    $(DSYMUTIL) $<
 
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@%_stripped: %
+@HAVE_ELF_TRUE@@HAVE_OBJCOPY_STRIPDEBUG_TRUE@@NATIVE_TRUE@     $(OBJCOPY) 
--strip-debug $< $@
+
 @HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@elf_for_test.c: elf.c
 @HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@      
SEARCH='^#define SYSTEM_BUILD_ID_DIR.*$$'; \
 @HAVE_ELF_TRUE@@HAVE_OBJCOPY_DEBUGLINK_TRUE@@NATIVE_TRUE@      
REPLACE="#define SYSTEM_BUILD_ID_DIR \"$(TEST_BUILD_ID_DIR)\""; \
diff --git a/libbacktrace/configure b/libbacktrace/configure
index 9c1493e7d7f4..0428486d10df 100755
--- a/libbacktrace/configure
+++ b/libbacktrace/configure
@@ -649,6 +649,8 @@ USE_DSYMUTIL_FALSE
 USE_DSYMUTIL_TRUE
 HAVE_OBJCOPY_DEBUGLINK_FALSE
 HAVE_OBJCOPY_DEBUGLINK_TRUE
+HAVE_OBJCOPY_STRIPDEBUG_FALSE
+HAVE_OBJCOPY_STRIPDEBUG_TRUE
 READELF
 OBJCOPY
 HAVE_COMPRESSED_DEBUG_ZSTD_FALSE
@@ -12024,7 +12026,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12027 "configure"
+#line 12029 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12130,7 +12132,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12133 "configure"
+#line 12135 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -14585,6 +14587,33 @@ $as_echo "no" >&6; }
 fi
 
 
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether objcopy supports 
--strip-debug" >&5
+$as_echo_n "checking whether objcopy supports --strip-debug... " >&6; }
+if ${libbacktrace_cv_objcopy_stripdebug+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "${with_target_subdir}"; then
+  libbacktrace_cv_objcopy_stripdebug=no
+elif ! test -n "${OBJCOPY}"; then
+  libbacktrace_cv_objcopy_stripdebug=no
+elif ${OBJCOPY} --help | grep strip-debug >/dev/null 2>&1; then
+  libbacktrace_cv_objcopy_stripdebug=yes
+else
+  libbacktrace_cv_objcopy_stripdebug=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 
$libbacktrace_cv_objcopy_stripdebug" >&5
+$as_echo "$libbacktrace_cv_objcopy_stripdebug" >&6; }
+ if test "$libbacktrace_cv_objcopy_stripdebug" = yes; then
+  HAVE_OBJCOPY_STRIPDEBUG_TRUE=
+  HAVE_OBJCOPY_STRIPDEBUG_FALSE='#'
+else
+  HAVE_OBJCOPY_STRIPDEBUG_TRUE='#'
+  HAVE_OBJCOPY_STRIPDEBUG_FALSE=
+fi
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether objcopy supports 
debuglink" >&5
 $as_echo_n "checking whether objcopy supports debuglink... " >&6; }
 if ${libbacktrace_cv_objcopy_debuglink+:} false; then :
@@ -15076,6 +15105,10 @@ if test -z "${HAVE_COMPRESSED_DEBUG_ZSTD_TRUE}" && 
test -z "${HAVE_COMPRESSED_DE
   as_fn_error $? "conditional \"HAVE_COMPRESSED_DEBUG_ZSTD\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_OBJCOPY_STRIPDEBUG_TRUE}" && test -z 
"${HAVE_OBJCOPY_STRIPDEBUG_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_OBJCOPY_STRIPDEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_OBJCOPY_DEBUGLINK_TRUE}" && test -z 
"${HAVE_OBJCOPY_DEBUGLINK_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_OBJCOPY_DEBUGLINK\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac
index d178a1260185..91830fe6f2f9 100644
--- a/libbacktrace/configure.ac
+++ b/libbacktrace/configure.ac
@@ -563,6 +563,20 @@ AM_CONDITIONAL(HAVE_COMPRESSED_DEBUG_ZSTD, test 
"$libgo_cv_ld_compress_zstd" = y
 AC_ARG_VAR(OBJCOPY, [location of objcopy])
 AC_CHECK_PROG(OBJCOPY, objcopy, objcopy,)
 AC_CHECK_PROG(READELF, readelf, readelf)
+
+AC_CACHE_CHECK([whether objcopy supports --strip-debug],
+[libbacktrace_cv_objcopy_stripdebug],
+[if test -n "${with_target_subdir}"; then
+  libbacktrace_cv_objcopy_stripdebug=no
+elif ! test -n "${OBJCOPY}"; then
+  libbacktrace_cv_objcopy_stripdebug=no
+elif ${OBJCOPY} --help | grep strip-debug >/dev/null 2>&1; then
+  libbacktrace_cv_objcopy_stripdebug=yes
+else
+  libbacktrace_cv_objcopy_stripdebug=no
+fi])
+AM_CONDITIONAL(HAVE_OBJCOPY_STRIPDEBUG, test 
"$libbacktrace_cv_objcopy_stripdebug" = yes)
+
 AC_CACHE_CHECK([whether objcopy supports debuglink],
 [libbacktrace_cv_objcopy_debuglink],
 [if test -n "${with_target_subdir}"; then
diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c
index 60489327024d..64e055b898ce 100644
--- a/libbacktrace/elf.c
+++ b/libbacktrace/elf.c
@@ -584,8 +584,14 @@ elf_nodebug (struct backtrace_state *state, uintptr_t pc,
       bdata.full_error_callback = error_callback;
       bdata.full_data = data;
       bdata.ret = 0;
-      state->syminfo_fn (state, pc, backtrace_syminfo_to_full_callback,
-                        backtrace_syminfo_to_full_error_callback, &bdata);
+      if (state->moredata)
+       state->syminfo_fn (state, pc,
+                          backtrace_syminfo_to_full_callback_moredata,
+                          backtrace_syminfo_to_full_error_callback,
+                          &bdata);
+      else
+       state->syminfo_fn (state, pc, backtrace_syminfo_to_full_callback,
+                          backtrace_syminfo_to_full_error_callback, &bdata);
       return bdata.ret;
     }
 
diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c
index 18bd87d65b36..4f92bf3632a2 100644
--- a/libbacktrace/fileline.c
+++ b/libbacktrace/fileline.c
@@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.  */
 #include <errno.h>
 #include <fcntl.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #if defined (HAVE_KERN_PROC_ARGS) || defined (HAVE_KERN_PROC)
@@ -425,12 +426,29 @@ backtrace_syminfo_to_full_callback (void *data, uintptr_t 
pc,
 {
   struct backtrace_call_full *bdata = (struct backtrace_call_full *) data;
 
-  /* If STATE->MOREDATA is set, then data will point to a
-     backtrace_moredata struct, which is what full_callback expects.  */
-
   bdata->ret = bdata->full_callback (bdata->full_data, pc, NULL, 0, symname);
 }
 
+/* Variant of backtrace_syminfo_to_full_callback that handles the exta
+   wrapping of moredata.  */
+
+void
+backtrace_syminfo_to_full_callback_moredata (void *data, uintptr_t pc,
+                                            const char *symname,
+                                            uintptr_t symval ATTRIBUTE_UNUSED,
+                                            uintptr_t symsize ATTRIBUTE_UNUSED)
+{
+  struct backtrace_moredata *md = (struct backtrace_moredata *) data;
+  struct backtrace_call_full *bdata;
+  struct backtrace_moredata callback_md;
+
+  bdata = (struct backtrace_call_full *) md->backtrace_data;
+  memset (&callback_md, 0, sizeof callback_md);
+  callback_md.backtrace_version = BACKTRACE_MOREDATA_VERSION;
+  callback_md.backtrace_data = bdata->full_data;
+  bdata->ret = bdata->full_callback (&callback_md, pc, NULL, 0, symname);
+}
+
 /* An error callback that corresponds to
    backtrace_syminfo_to_full_callback.  */
 
diff --git a/libbacktrace/internal.h b/libbacktrace/internal.h
index 26b41fb7f7f7..e678b710d506 100644
--- a/libbacktrace/internal.h
+++ b/libbacktrace/internal.h
@@ -394,6 +394,15 @@ extern void backtrace_syminfo_to_full_callback (void 
*data, uintptr_t pc,
                                                uintptr_t symval,
                                                uintptr_t symsize);
 
+/* A variant of backtrace_syminfo_to_full_callback for when the moredata
+   flag is set.  */
+
+extern void backtrace_syminfo_to_full_callback_moredata (void *data,
+                                                        uintptr_t pc,
+                                                        const char *symname,
+                                                        uintptr_t symval,
+                                                        uintptr_t symsize);
+
 /* An error callback that corresponds to
    backtrace_syminfo_to_full_callback.  */
 
diff --git a/libbacktrace/strippedtest.c b/libbacktrace/strippedtest.c
new file mode 100644
index 000000000000..51892d7465a2
--- /dev/null
+++ b/libbacktrace/strippedtest.c
@@ -0,0 +1,215 @@
+/* strippedtest.c -- Test for libbacktrace library with no debug info
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   Written by Ian Lance Taylor.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    (1) Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+    (2) Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+    (3) The name of the author may not be used to
+    endorse or promote products derived from this software without
+    specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.  */
+
+/* Test libbacktrace when there is no debug info.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "backtrace.h"
+#include "backtrace-supported.h"
+#include "internal.h"
+
+#include "testlib.h"
+
+/* Used to collect moredata info from backtraces.  */
+
+struct mdinfo
+{
+  int decl_lineno;
+};
+
+/* We pass a pointer to this as the data field to the backtrace
+   functions.  */
+
+struct mddata
+{
+  struct bdata bdata;
+  struct mdinfo *mdall;
+};
+
+/* backtrace_full_callback with moredata flag.  */
+
+static int
+md_callback_one (void *vdata, uintptr_t pc, const char *filename, int lineno,
+                const char *function)
+{
+  struct backtrace_moredata *md = (struct backtrace_moredata *) vdata;
+  struct mddata *mddata = (struct mddata *) md->backtrace_data;
+  struct bdata *data = &mddata->bdata;
+
+  if (md->backtrace_version != BACKTRACE_MOREDATA_VERSION)
+    {
+      fprintf (stderr,
+              "md_callback_one: wrong moredata version: got %u, want %u\n",
+              md->backtrace_version, BACKTRACE_MOREDATA_VERSION);
+      data->failed = 1;
+      return 1;
+    }
+
+  if (data->index < data->max)
+    mddata->mdall[data->index].decl_lineno = md->backtrace_decl_lineno;
+
+  return callback_one ((void *) data, pc, filename, lineno, function);
+}
+
+/* The check function for a stripped executable.  */
+
+static void
+stripped_check (const char *name, int index, const struct info *all,
+               const char *want_function, int *failed)
+{
+  if (*failed)
+    return;
+  if (all[index].filename != NULL)
+    {
+      fprintf (stderr, "%s: [%d]: unexpected file name in stripped program\n",
+              name, index);
+      *failed = 1;
+    }
+  if (all[index].function == NULL)
+    {
+      fprintf (stderr, "%s: [%d]: missing function name\n",
+              name, index);
+      *failed = 1;
+      return;
+    }
+  if (all[index].lineno != 0)
+    {
+      fprintf (stderr, "%s: [%d]: got %d expected 0\n", name, index,
+              all[index].lineno);
+      *failed = 1;
+    }
+  if (strcmp (all[index].function, want_function) != 0)
+    {
+      fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
+              all[index].function, want_function);
+      *failed = 1;
+    }
+}
+
+static int test1 (int) __attribute__ ((noinline, noclone, optnone, unused));
+static int f2 (int, int) __attribute__ ((noinline, noclone));
+static int f3 (int, int, int) __attribute__ ((noinline, noclone));
+
+static int
+test1 (int mdtest)
+{
+  return f2 (mdtest, __LINE__) + 1;
+}
+
+static int
+f2 (int mdtest, int f1line)
+{
+  return f3 (mdtest, f1line, __LINE__) + 2;
+}
+
+static int
+f3 (int mdtest, int f1line ATTRIBUTE_UNUSED, int f2line ATTRIBUTE_UNUSED)
+{
+  struct info all[20];
+  struct mdinfo mdall[20];
+  struct bdata bdata;
+  struct mddata mddata;
+  void *data;
+  backtrace_full_callback callback;
+  int i;
+  int failed;
+  size_t index;
+
+  bdata.all = &all[0];
+  bdata.index = 0;
+  bdata.max = 20;
+  bdata.failed = 0;
+  data = (void *) &bdata;
+  callback = callback_one;
+
+  if (mdtest)
+    {
+      mddata.bdata = bdata;
+      mddata.mdall = &mdall[0];
+      data = (void *) &mddata;
+      callback = md_callback_one;
+    }
+
+  i = backtrace_full (state, 0, callback, error_callback_one, data);
+
+  failed = mdtest ? mddata.bdata.failed : bdata.failed;
+
+  if (i != 0)
+    {
+      fprintf (stderr, "test1: unexpected return value %d\n", i);
+      failed = 1;
+    }
+
+  index = mdtest ? mddata.bdata.index : bdata.index;
+  if (index < 3)
+    {
+      fprintf (stderr,
+              "test1: not enough frames; got %zu, expected at least 3\n",
+              index);
+      failed = 1;
+    }
+
+  stripped_check ("test1", 0, all, "f3", &failed);
+  stripped_check ("test1", 1, all, "f2", &failed);
+  stripped_check ("test1", 2, all, "test1", &failed);
+
+  printf ("%s: backtrace_full noinline%s\n", failed ? "FAIL" : "PASS",
+         mdtest ? " mdtest" : "");
+
+  if (failed)
+    ++failures;
+
+  return failures;
+}
+
+int
+main (int argc ATTRIBUTE_UNUSED, char **argv)
+{
+  state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
+                                 error_callback_create, NULL);
+
+#if BACKTRACE_SUPPORTED
+  test1 (0);
+#endif
+
+  state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS | 2,
+                                 error_callback_create, NULL);
+
+#if BACKTRACE_SUPPORTED
+  test1 (1);
+#endif
+
+  exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
+}

Reply via email to