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.
This commit is contained in:
Ian Lance Taylor
2026-09-01 15:17:39 -07:00
parent 3bd5a08e4f
commit 735c54d9dc
8 changed files with 438 additions and 86 deletions
+17
View File
@@ -133,6 +133,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) -all-static
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
+119 -79
View File
@@ -15,7 +15,7 @@
@SET_MAKE@
# Makefile.am -- Backtrace Makefile.
# Copyright (C) 2012-2024 Free Software Foundation, Inc.
# Copyright (C) 2012-2026 Free Software Foundation, Inc.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
@@ -122,53 +122,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/lead-dot.m4 \
@@ -250,39 +252,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)
@@ -448,6 +451,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)
@@ -654,11 +664,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) \
@@ -1051,20 +1061,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
@@ -1073,7 +1083,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
@@ -1081,6 +1091,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) -all-static
@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 \
@@ -1168,10 +1182,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)
@@ -1180,11 +1194,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)
@@ -1248,13 +1262,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
@@ -2249,6 +2279,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'; \
@@ -2713,6 +2750,9 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
@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)\""; \
Vendored
+35 -2
View File
@@ -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
@@ -11397,7 +11399,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11400 "configure"
#line 11402 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11503,7 +11505,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
#line 11506 "configure"
#line 11508 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13254,6 +13256,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 :
@@ -13745,6 +13774,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
+14
View File
@@ -560,6 +560,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
+8 -2
View File
@@ -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;
}
+21 -3
View File
@@ -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. */
+9
View File
@@ -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. */
+215
View File
@@ -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);
}