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); +}
