mirror of
https://github.com/ianlancetaylor/libbacktrace.git
synced 2026-03-26 03:59:06 +08:00
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:
20
pecoff.c
20
pecoff.c
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user