diff options
author | Ian Lance Taylor <iant@golang.org> | 2020-09-08 19:21:54 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-09-08 19:21:54 -0700 |
commit | f56f1a5a755e4f2080ff709ad7bf4088b84faefe (patch) | |
tree | c1800123a8d10d3c1e0c28ed17f6b70ae59f6917 | |
parent | 181f877b6c0e365c940b117c306e7309e19ffd89 (diff) | |
download | gcc-f56f1a5a755e4f2080ff709ad7bf4088b84faefe.zip gcc-f56f1a5a755e4f2080ff709ad7bf4088b84faefe.tar.gz gcc-f56f1a5a755e4f2080ff709ad7bf4088b84faefe.tar.bz2 |
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.
-rw-r--r-- | libbacktrace/pecoff.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index 221571c..49e5c3d 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -330,7 +330,7 @@ coff_is_function_symbol (const b_coff_internal_symbol *isym) static int 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_external_symbol *syms, size_t syms_size, const unsigned char *strtab, size_t strtab_size, @@ -426,9 +426,12 @@ coff_initialize_syminfo (struct backtrace_state *state, else name = isym.name; - /* Strip leading '_'. */ - if (name[0] == '_') - name++; + if (!is_64) + { + /* Strip leading '_'. */ + if (name[0] == '_') + name++; + } /* Symbol value is section relative, so we need to read the address of its section. */ @@ -605,6 +608,7 @@ coff_add (struct backtrace_state *state, int descriptor, off_t max_offset; struct backtrace_view debug_view; int debug_view_valid; + int is_64; uintptr_t image_base; struct dwarf_sections dwarf_sections; @@ -680,12 +684,16 @@ coff_add (struct backtrace_state *state, int descriptor, sects = (const b_coff_section_header *) (sects_view.data + fhdr.size_of_optional_header); + is_64 = 0; if (fhdr.size_of_optional_header > sizeof (*opt_hdr)) { if (opt_hdr->magic == PE_MAGIC) image_base = opt_hdr->u.pe.image_base; 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 { 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) goto fail; - if (!coff_initialize_syminfo (state, image_base, + if (!coff_initialize_syminfo (state, image_base, is_64, sects, sects_num, syms_view.data, syms_size, str_view.data, str_size, |