X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=libbacktrace%2Fpecoff.c;h=49e5c3d868c145d31d54c284798a7eaa882ba418;hb=cb84595d3f406fb466c68e5ff6661dd8ee4a4e9c;hp=f932f35d4cf5736c3d4d37907269a7dd6656c0be;hpb=c926fd82bbd336b317266d43b9fa67a83397b06b;p=gcc.git diff --git a/libbacktrace/pecoff.c b/libbacktrace/pecoff.c index f932f35d4cf..49e5c3d868c 100644 --- a/libbacktrace/pecoff.c +++ b/libbacktrace/pecoff.c @@ -1,5 +1,5 @@ /* pecoff.c -- Get debug data from a PE/COFFF file for backtraces. - Copyright (C) 2015-2019 Free Software Foundation, Inc. + Copyright (C) 2015-2020 Free Software Foundation, Inc. Adapted from elf.c by Tristan Gingold, AdaCore. Redistribution and use in source and binary forms, with or without @@ -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,