libbacktrace: don't strip leading underscore on 64-bit PE

* pecoff.c (coff_initialize_syminfo): Add is_64 parameter.
	(coff_add): Determine and pass is_64.

Closes #28
This commit is contained in:
Ian Lance Taylor
2020-09-08 19:21:54 -07:00
parent 4ae8d988a7
commit 2f5efbfa32

View File

@@ -330,7 +330,7 @@ coff_is_function_symbol (const b_coff_internal_symbol *isym)
static int static int
coff_initialize_syminfo (struct backtrace_state *state, coff_initialize_syminfo (struct backtrace_state *state,
uintptr_t base_address, uintptr_t base_address, int is_64,
const b_coff_section_header *sects, size_t sects_num, const b_coff_section_header *sects, size_t sects_num,
const b_coff_external_symbol *syms, size_t syms_size, const b_coff_external_symbol *syms, size_t syms_size,
const unsigned char *strtab, size_t strtab_size, const unsigned char *strtab, size_t strtab_size,
@@ -426,9 +426,12 @@ coff_initialize_syminfo (struct backtrace_state *state,
else else
name = isym.name; name = isym.name;
/* Strip leading '_'. */ if (!is_64)
if (name[0] == '_') {
name++; /* Strip leading '_'. */
if (name[0] == '_')
name++;
}
/* Symbol value is section relative, so we need to read the address /* Symbol value is section relative, so we need to read the address
of its section. */ of its section. */
@@ -605,6 +608,7 @@ coff_add (struct backtrace_state *state, int descriptor,
off_t max_offset; off_t max_offset;
struct backtrace_view debug_view; struct backtrace_view debug_view;
int debug_view_valid; int debug_view_valid;
int is_64;
uintptr_t image_base; uintptr_t image_base;
struct dwarf_sections dwarf_sections; struct dwarf_sections dwarf_sections;
@@ -680,12 +684,16 @@ coff_add (struct backtrace_state *state, int descriptor,
sects = (const b_coff_section_header *) sects = (const b_coff_section_header *)
(sects_view.data + fhdr.size_of_optional_header); (sects_view.data + fhdr.size_of_optional_header);
is_64 = 0;
if (fhdr.size_of_optional_header > sizeof (*opt_hdr)) if (fhdr.size_of_optional_header > sizeof (*opt_hdr))
{ {
if (opt_hdr->magic == PE_MAGIC) if (opt_hdr->magic == PE_MAGIC)
image_base = opt_hdr->u.pe.image_base; image_base = opt_hdr->u.pe.image_base;
else if (opt_hdr->magic == PEP_MAGIC) else if (opt_hdr->magic == PEP_MAGIC)
image_base = opt_hdr->u.pep.image_base; {
image_base = opt_hdr->u.pep.image_base;
is_64 = 1;
}
else else
{ {
error_callback (data, "bad magic in PE optional header", 0); error_callback (data, "bad magic in PE optional header", 0);
@@ -778,7 +786,7 @@ coff_add (struct backtrace_state *state, int descriptor,
if (sdata == NULL) if (sdata == NULL)
goto fail; goto fail;
if (!coff_initialize_syminfo (state, image_base, if (!coff_initialize_syminfo (state, image_base, is_64,
sects, sects_num, sects, sects_num,
syms_view.data, syms_size, syms_view.data, syms_size,
str_view.data, str_size, str_view.data, str_size,