Commit 9ad458d5 by Tom de Vries Committed by Tom de Vries

[libbacktrace] Add altlink field to struct dwarf_data

Add an altlink field to struct dwarf_data, and initialize it with the pointer
to the struct dwarf_data for the .gnu_debugaltlink.

2019-01-17  Tom de Vries  <tdevries@suse.de>

	* dwarf.c (struct dwarf_data): Add altlink field.
	(backtrace_dwarf_add): Add and handle fileline_altlink parameter.
	* elf.c	(elf_add): Add argument to backtrace_dwarf_add call.
	(phdr_callback, backtrace_initialize): Add argument to elf_add calls.
	* internal.h (backtrace_dwarf_add): Add fileline_altlink parameter.
	* pecoff.c (coff_add): Add argument to backtrace_dwarf_add call.
	* xcoff.c (xcoff_add): Same.

From-SVN: r267994
parent e6f00c83
2019-01-17 Tom de Vries <tdevries@suse.de> 2019-01-17 Tom de Vries <tdevries@suse.de>
* dwarf.c (struct dwarf_data): Add altlink field.
(backtrace_dwarf_add): Add and handle fileline_altlink parameter.
* elf.c (elf_add): Add argument to backtrace_dwarf_add call.
(phdr_callback, backtrace_initialize): Add argument to elf_add calls.
* internal.h (backtrace_dwarf_add): Add fileline_altlink parameter.
* pecoff.c (coff_add): Add argument to backtrace_dwarf_add call.
* xcoff.c (xcoff_add): Same.
2019-01-17 Tom de Vries <tdevries@suse.de>
* internal.h (backtrace_dwarf_add): Add fileline_entry parameter. * internal.h (backtrace_dwarf_add): Add fileline_entry parameter.
* dwarf.c (backtrace_dwarf_add): Add and handle fileline_entry parameter. * dwarf.c (backtrace_dwarf_add): Add and handle fileline_entry parameter.
* elf.c (elf_add): Add and handle fileline_entry parameter. Add * elf.c (elf_add): Add and handle fileline_entry parameter. Add
......
...@@ -343,6 +343,8 @@ struct dwarf_data ...@@ -343,6 +343,8 @@ struct dwarf_data
{ {
/* The data for the next file we know about. */ /* The data for the next file we know about. */
struct dwarf_data *next; struct dwarf_data *next;
/* The data for .gnu_debugaltlink. */
struct dwarf_data *altlink;
/* The base address for this file. */ /* The base address for this file. */
uintptr_t base_address; uintptr_t base_address;
/* A sorted list of address ranges. */ /* A sorted list of address ranges. */
...@@ -3000,6 +3002,7 @@ build_dwarf_data (struct backtrace_state *state, ...@@ -3000,6 +3002,7 @@ build_dwarf_data (struct backtrace_state *state,
const unsigned char *dwarf_str, const unsigned char *dwarf_str,
size_t dwarf_str_size, size_t dwarf_str_size,
int is_bigendian, int is_bigendian,
struct dwarf_data *altlink,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
void *data) void *data)
{ {
...@@ -3028,6 +3031,7 @@ build_dwarf_data (struct backtrace_state *state, ...@@ -3028,6 +3031,7 @@ build_dwarf_data (struct backtrace_state *state,
return NULL; return NULL;
fdata->next = NULL; fdata->next = NULL;
fdata->altlink = altlink;
fdata->base_address = base_address; fdata->base_address = base_address;
fdata->addrs = addrs; fdata->addrs = addrs;
fdata->addrs_count = addrs_count; fdata->addrs_count = addrs_count;
...@@ -3063,6 +3067,7 @@ backtrace_dwarf_add (struct backtrace_state *state, ...@@ -3063,6 +3067,7 @@ backtrace_dwarf_add (struct backtrace_state *state,
const unsigned char *dwarf_str, const unsigned char *dwarf_str,
size_t dwarf_str_size, size_t dwarf_str_size,
int is_bigendian, int is_bigendian,
struct dwarf_data *fileline_altlink,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
void *data, fileline *fileline_fn, void *data, fileline *fileline_fn,
struct dwarf_data **fileline_entry) struct dwarf_data **fileline_entry)
...@@ -3073,7 +3078,7 @@ backtrace_dwarf_add (struct backtrace_state *state, ...@@ -3073,7 +3078,7 @@ backtrace_dwarf_add (struct backtrace_state *state,
dwarf_line, dwarf_line_size, dwarf_abbrev, dwarf_line, dwarf_line_size, dwarf_abbrev,
dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size, dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size,
dwarf_str, dwarf_str_size, is_bigendian, dwarf_str, dwarf_str_size, is_bigendian,
error_callback, data); fileline_altlink, error_callback, data);
if (fdata == NULL) if (fdata == NULL)
return 0; return 0;
......
...@@ -3097,6 +3097,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3097,6 +3097,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
debuglink_view_valid = 0; debuglink_view_valid = 0;
} }
struct dwarf_data *fileline_altlink = NULL;
if (debugaltlink_name != NULL) if (debugaltlink_name != NULL)
{ {
int d; int d;
...@@ -3108,7 +3109,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3108,7 +3109,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
int ret; int ret;
ret = elf_add (state, filename, d, base_address, error_callback, data, ret = elf_add (state, filename, d, base_address, error_callback, data,
fileline_fn, found_sym, found_dwarf, NULL, fileline_fn, found_sym, found_dwarf, &fileline_altlink,
0, 1, debugaltlink_buildid_data, 0, 1, debugaltlink_buildid_data,
debugaltlink_buildid_size); debugaltlink_buildid_size);
backtrace_release_view (state, &debugaltlink_view, error_callback, backtrace_release_view (state, &debugaltlink_view, error_callback,
...@@ -3265,6 +3266,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3265,6 +3266,7 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
sections[DEBUG_STR].data, sections[DEBUG_STR].data,
sections[DEBUG_STR].size, sections[DEBUG_STR].size,
ehdr.e_ident[EI_DATA] == ELFDATA2MSB, ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
fileline_altlink,
error_callback, data, fileline_fn, error_callback, data, fileline_fn,
fileline_entry)) fileline_entry))
goto fail; goto fail;
......
...@@ -303,6 +303,7 @@ extern int backtrace_dwarf_add (struct backtrace_state *state, ...@@ -303,6 +303,7 @@ extern int backtrace_dwarf_add (struct backtrace_state *state,
const unsigned char *dwarf_str, const unsigned char *dwarf_str,
size_t dwarf_str_size, size_t dwarf_str_size,
int is_bigendian, int is_bigendian,
struct dwarf_data *fileline_altlink,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
void *data, fileline *fileline_fn, void *data, fileline *fileline_fn,
struct dwarf_data **fileline_entry); struct dwarf_data **fileline_entry);
......
...@@ -867,6 +867,7 @@ coff_add (struct backtrace_state *state, int descriptor, ...@@ -867,6 +867,7 @@ coff_add (struct backtrace_state *state, int descriptor,
sections[DEBUG_STR].data, sections[DEBUG_STR].data,
sections[DEBUG_STR].size, sections[DEBUG_STR].size,
0, /* FIXME */ 0, /* FIXME */
NULL,
error_callback, data, fileline_fn, error_callback, data, fileline_fn,
NULL)) NULL))
goto fail; goto fail;
......
...@@ -1315,6 +1315,7 @@ xcoff_add (struct backtrace_state *state, int descriptor, off_t offset, ...@@ -1315,6 +1315,7 @@ xcoff_add (struct backtrace_state *state, int descriptor, off_t offset,
dwsect[DWSECT_STR].data, dwsect[DWSECT_STR].data,
dwsect[DWSECT_STR].size, dwsect[DWSECT_STR].size,
1, /* big endian */ 1, /* big endian */
NULL,
error_callback, data, fileline_fn, error_callback, data, fileline_fn,
NULL)) NULL))
goto fail; goto fail;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment