Add an altlink field to struct dwarf_data, and initialize it with the pointer to the struct dwarf_data for the .gnu_debugaltlink.
2018-11-11 Tom de Vries <tdevr...@suse.de> * dwarf.c (struct dwarf_data): Add altlink field. (backtrace_dwarf_add): Add and handle fileline_entry and fileline_altlink parameters. * elf.c (elf_add): Add and handle fileline_entry parameter. Add args to backtrace_dwarf_add call. (phdr_callback, backtrace_initialize): Add arguments to elf_add calls. * internal.h (backtrace_dwarf_add): Add fileline_entry and fileline_altlink parameters. * pecoff.c (coff_add): Add args to backtrace_dwarf_add call. * xcoff.c (xcoff_add): Same. --- libbacktrace/dwarf.c | 13 ++++++++++--- libbacktrace/elf.c | 24 +++++++++++++++--------- libbacktrace/internal.h | 4 +++- libbacktrace/pecoff.c | 3 ++- libbacktrace/xcoff.c | 3 ++- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index 0f8f70881f8..b571c9fbb06 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -343,6 +343,8 @@ struct dwarf_data { /* The data for the next file we know about. */ struct dwarf_data *next; + /* The data for .gnu_debugaltlink. */ + struct dwarf_data *altlink; /* The base address for this file. */ uintptr_t base_address; /* A sorted list of address ranges. */ @@ -2968,7 +2970,7 @@ build_dwarf_data (struct backtrace_state *state, size_t dwarf_str_size, int is_bigendian, backtrace_error_callback error_callback, - void *data) + void *data, struct dwarf_data *altlink) { struct unit_addrs_vector addrs_vec; struct unit_addrs *addrs; @@ -2995,6 +2997,7 @@ build_dwarf_data (struct backtrace_state *state, return NULL; fdata->next = NULL; + fdata->altlink = altlink; fdata->base_address = base_address; fdata->addrs = addrs; fdata->addrs_count = addrs_count; @@ -3031,7 +3034,8 @@ backtrace_dwarf_add (struct backtrace_state *state, size_t dwarf_str_size, int is_bigendian, backtrace_error_callback error_callback, - void *data, fileline *fileline_fn) + void *data, fileline *fileline_fn, void **fileline_entry, + void *fileline_altlink) { struct dwarf_data *fdata; @@ -3039,10 +3043,13 @@ backtrace_dwarf_add (struct backtrace_state *state, dwarf_line, dwarf_line_size, dwarf_abbrev, dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size, dwarf_str, dwarf_str_size, is_bigendian, - error_callback, data); + error_callback, data, fileline_altlink); if (fdata == NULL) return 0; + if (fileline_entry != NULL) + *fileline_entry = fdata; + if (!state->threaded) { struct dwarf_data **pp; diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c index f3bc2119c07..aeb248ec5e3 100644 --- a/libbacktrace/elf.c +++ b/libbacktrace/elf.c @@ -2638,8 +2638,8 @@ static int elf_add (struct backtrace_state *state, const char *filename, int descriptor, uintptr_t base_address, backtrace_error_callback error_callback, void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf, - int exe, int debuginfo, const char *with_buildid_data, - uint32_t with_buildid_size) + void **fileline_entry, int exe, int debuginfo, + const char *with_buildid_data, uint32_t with_buildid_size) { struct backtrace_view ehdr_view; b_elf_ehdr ehdr; @@ -3037,7 +3037,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, backtrace_release_view (state, &debugaltlink_view, error_callback, data); ret = elf_add (state, NULL, d, base_address, error_callback, data, - fileline_fn, found_sym, found_dwarf, 0, 1, NULL, 0); + fileline_fn, found_sym, found_dwarf, NULL, 0, 1, NULL, + 0); if (ret < 0) backtrace_close (d, error_callback, data); else @@ -3075,7 +3076,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, backtrace_release_view (state, &debugaltlink_view, error_callback, data); ret = elf_add (state, NULL, d, base_address, error_callback, data, - fileline_fn, found_sym, found_dwarf, 0, 1, NULL, 0); + fileline_fn, found_sym, found_dwarf, NULL, 0, 1, NULL, + 0); if (ret < 0) backtrace_close (d, error_callback, data); else @@ -3090,6 +3092,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, debuglink_view_valid = 0; } + void *fileline_altlink = NULL; if (debugaltlink_name != NULL) { int d; @@ -3101,8 +3104,9 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, int ret; ret = elf_add (state, filename, d, base_address, error_callback, data, - fileline_fn, found_sym, found_dwarf, 0, 1, - debugaltlink_buildid_data, debugaltlink_buildid_size); + fileline_fn, found_sym, found_dwarf, &fileline_altlink, + 0, 1, debugaltlink_buildid_data, + debugaltlink_buildid_size); backtrace_release_view (state, &debugaltlink_view, error_callback, data); debugaltlink_view_valid = 0; @@ -3264,7 +3268,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, sections[DEBUG_STR].data, sections[DEBUG_STR].size, ehdr.e_ident[EI_DATA] == ELFDATA2MSB, - error_callback, data, fileline_fn)) + error_callback, data, fileline_fn, + fileline_entry, fileline_altlink)) goto fail; *found_dwarf = 1; @@ -3354,7 +3359,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED, if (elf_add (pd->state, filename, descriptor, info->dlpi_addr, pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym, - &found_dwarf, 0, 0, NULL, 0)) + &found_dwarf, NULL, 0, 0, NULL, 0)) { if (found_dwarf) { @@ -3382,7 +3387,8 @@ backtrace_initialize (struct backtrace_state *state, const char *filename, struct phdr_data pd; ret = elf_add (state, filename, descriptor, 0, error_callback, data, - &elf_fileline_fn, &found_sym, &found_dwarf, 1, 0, NULL, 0); + &elf_fileline_fn, &found_sym, &found_dwarf, NULL, 1, 0, NULL, + 0); if (!ret) return 0; diff --git a/libbacktrace/internal.h b/libbacktrace/internal.h index 548f9d70905..bcf5a31da68 100644 --- a/libbacktrace/internal.h +++ b/libbacktrace/internal.h @@ -302,7 +302,9 @@ extern int backtrace_dwarf_add (struct backtrace_state *state, size_t dwarf_str_size, int is_bigendian, backtrace_error_callback error_callback, - void *data, fileline *fileline_fn); + void *data, fileline *fileline_fn, + void **fileline_entry, + void *fileline_altlink); /* A test-only hook for elf_uncompress_zdebug. */ diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 85737d61d49..fbe481cbbb6 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -867,7 +867,8 @@ coff_add (struct backtrace_state *state, int descriptor, sections[DEBUG_STR].data, sections[DEBUG_STR].size, 0, /* FIXME */ - error_callback, data, fileline_fn)) + error_callback, data, fileline_fn, + NULL, NULL)) goto fail; *found_dwarf = 1; diff --git a/libbacktrace/xcoff.c b/libbacktrace/xcoff.c index 84d0340d744..dc8265c59a8 100644 --- a/libbacktrace/xcoff.c +++ b/libbacktrace/xcoff.c @@ -1315,7 +1315,8 @@ xcoff_add (struct backtrace_state *state, int descriptor, off_t offset, dwsect[DWSECT_STR].data, dwsect[DWSECT_STR].size, 1, /* big endian */ - error_callback, data, fileline_fn)) + error_callback, data, fileline_fn, + NULL, NULL)) goto fail; } -- 2.16.4