mirror of
https://github.com/ianlancetaylor/libbacktrace.git
synced 2026-09-07 12:17:06 +08:00
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:
+21
-3
@@ -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. */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user