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
+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. */