Commit e6f00c83 by Tom de Vries Committed by Tom de Vries

[libbacktrace] Return struct dwarf_data pointer from elf_add

Allow the caller of elf_add access to the struct dwarf_data pointer
corresponding to the added elf.

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

	* internal.h (backtrace_dwarf_add): Add 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
	argument to backtrace_dwarf_add call.
	(phdr_callback, backtrace_initialize): Add argument to elf_add calls.
	* pecoff.c (coff_add): Add argument to backtrace_dwarf_add call.
	* xcoff.c (xcoff_add): Same.

From-SVN: r267993
parent a34c2a3d
2019-01-17 Tom de Vries <tdevries@suse.de> 2019-01-17 Tom de Vries <tdevries@suse.de>
* internal.h (backtrace_dwarf_add): Add 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
argument to backtrace_dwarf_add call.
(phdr_callback, backtrace_initialize): Add argument to elf_add calls.
* 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>
* elf.c (elf_add): Add and handle with_buildid_data and * elf.c (elf_add): Add and handle with_buildid_data and
with_buildid_size parameters. Handle .gnu_debugaltlink section. with_buildid_size parameters. Handle .gnu_debugaltlink section.
(phdr_callback, backtrace_initialize): Add arguments to elf_add calls. (phdr_callback, backtrace_initialize): Add arguments to elf_add calls.
......
...@@ -3064,7 +3064,8 @@ backtrace_dwarf_add (struct backtrace_state *state, ...@@ -3064,7 +3064,8 @@ backtrace_dwarf_add (struct backtrace_state *state,
size_t dwarf_str_size, size_t dwarf_str_size,
int is_bigendian, int is_bigendian,
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 *fdata; struct dwarf_data *fdata;
...@@ -3076,6 +3077,9 @@ backtrace_dwarf_add (struct backtrace_state *state, ...@@ -3076,6 +3077,9 @@ backtrace_dwarf_add (struct backtrace_state *state,
if (fdata == NULL) if (fdata == NULL)
return 0; return 0;
if (fileline_entry != NULL)
*fileline_entry = fdata;
if (!state->threaded) if (!state->threaded)
{ {
struct dwarf_data **pp; struct dwarf_data **pp;
......
...@@ -2638,8 +2638,8 @@ static int ...@@ -2638,8 +2638,8 @@ static int
elf_add (struct backtrace_state *state, const char *filename, int descriptor, elf_add (struct backtrace_state *state, const char *filename, int descriptor,
uintptr_t base_address, backtrace_error_callback error_callback, uintptr_t base_address, backtrace_error_callback error_callback,
void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf, void *data, fileline *fileline_fn, int *found_sym, int *found_dwarf,
int exe, int debuginfo, const char *with_buildid_data, struct dwarf_data **fileline_entry, int exe, int debuginfo,
uint32_t with_buildid_size) const char *with_buildid_data, uint32_t with_buildid_size)
{ {
struct backtrace_view ehdr_view; struct backtrace_view ehdr_view;
b_elf_ehdr ehdr; b_elf_ehdr ehdr;
...@@ -3042,7 +3042,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3042,7 +3042,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
backtrace_release_view (state, &debugaltlink_view, error_callback, backtrace_release_view (state, &debugaltlink_view, error_callback,
data); data);
ret = elf_add (state, NULL, d, base_address, 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) if (ret < 0)
backtrace_close (d, error_callback, data); backtrace_close (d, error_callback, data);
else else
...@@ -3080,7 +3081,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3080,7 +3081,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
backtrace_release_view (state, &debugaltlink_view, error_callback, backtrace_release_view (state, &debugaltlink_view, error_callback,
data); data);
ret = elf_add (state, NULL, d, base_address, 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) if (ret < 0)
backtrace_close (d, error_callback, data); backtrace_close (d, error_callback, data);
else else
...@@ -3106,8 +3108,9 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3106,8 +3108,9 @@ 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, 0, 1, fileline_fn, found_sym, found_dwarf, NULL,
debugaltlink_buildid_data, debugaltlink_buildid_size); 0, 1, debugaltlink_buildid_data,
debugaltlink_buildid_size);
backtrace_release_view (state, &debugaltlink_view, error_callback, backtrace_release_view (state, &debugaltlink_view, error_callback,
data); data);
debugaltlink_view_valid = 0; debugaltlink_view_valid = 0;
...@@ -3262,7 +3265,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, ...@@ -3262,7 +3265,8 @@ 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,
error_callback, data, fileline_fn)) error_callback, data, fileline_fn,
fileline_entry))
goto fail; goto fail;
*found_dwarf = 1; *found_dwarf = 1;
...@@ -3352,7 +3356,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED, ...@@ -3352,7 +3356,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
if (elf_add (pd->state, filename, descriptor, info->dlpi_addr, if (elf_add (pd->state, filename, descriptor, info->dlpi_addr,
pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym, 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) if (found_dwarf)
{ {
...@@ -3380,7 +3384,8 @@ backtrace_initialize (struct backtrace_state *state, const char *filename, ...@@ -3380,7 +3384,8 @@ backtrace_initialize (struct backtrace_state *state, const char *filename,
struct phdr_data pd; struct phdr_data pd;
ret = elf_add (state, filename, descriptor, 0, error_callback, data, 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) if (!ret)
return 0; return 0;
......
...@@ -286,6 +286,8 @@ extern int backtrace_initialize (struct backtrace_state *state, ...@@ -286,6 +286,8 @@ extern int backtrace_initialize (struct backtrace_state *state,
void *data, void *data,
fileline *fileline_fn); fileline *fileline_fn);
struct dwarf_data;
/* Add file/line information for a DWARF module. */ /* Add file/line information for a DWARF module. */
extern int backtrace_dwarf_add (struct backtrace_state *state, extern int backtrace_dwarf_add (struct backtrace_state *state,
...@@ -302,7 +304,8 @@ extern int backtrace_dwarf_add (struct backtrace_state *state, ...@@ -302,7 +304,8 @@ extern int backtrace_dwarf_add (struct backtrace_state *state,
size_t dwarf_str_size, size_t dwarf_str_size,
int is_bigendian, int is_bigendian,
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);
/* A test-only hook for elf_uncompress_zdebug. */ /* A test-only hook for elf_uncompress_zdebug. */
......
...@@ -867,7 +867,8 @@ coff_add (struct backtrace_state *state, int descriptor, ...@@ -867,7 +867,8 @@ 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 */
error_callback, data, fileline_fn)) error_callback, data, fileline_fn,
NULL))
goto fail; goto fail;
*found_dwarf = 1; *found_dwarf = 1;
......
...@@ -1315,7 +1315,8 @@ xcoff_add (struct backtrace_state *state, int descriptor, off_t offset, ...@@ -1315,7 +1315,8 @@ 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 */
error_callback, data, fileline_fn)) error_callback, data, fileline_fn,
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