typedef BOOL WINAPI (SymCleanup_ftype) (HANDLE);
typedef DWORD64 WINAPI (SymLoadModule64_ftype) (HANDLE, HANDLE, PCSTR,
PCSTR, DWORD64, DWORD);
+typedef BOOL WINAPI (SymGetModuleInfo64_ftype)
+ (HANDLE, DWORD64, PIMAGEHLP_MODULE64);
typedef BOOL WINAPI (SymFromName_ftype) (HANDLE, PCSTR, PSYMBOL_INFO);
typedef BOOL WINAPI (SymEnumTypes_ftype)
(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACK, PVOID);
SymSetContext_ftype *fSymSetContext;
SymSearch_ftype *fSymSearch;
DWORD64 addr;
+ ULONGEST base_ofs;
DWORD64 max_addr;
symbol *tls_index_sym;
std::vector<type *> cache;
&& pli->fSymGetTypeInfo (pli->p, pli->addr, si->info,
TI_GET_LENGTH, &length))
{
- pli->builder->push_context (0, si->Address);
+ ULONGEST addr = si->Address + pli->base_ofs;
+
+ pli->builder->push_context (0, addr);
pdb_enum_locals (pli, si);
if (*pli->builder->get_local_symbols () != NULL)
pli->builder->finish_block (0, cstk.old_blocks, NULL,
- si->Address, si->Address + length);
+ addr, addr + length);
*pli->builder->get_local_symbols () = cstk.locals;
pli->builder->set_local_using_directives (cstk.local_using_directives);
}
else
{
- SET_SYMBOL_VALUE_ADDRESS (sym, si->Address);
+ SET_SYMBOL_VALUE_ADDRESS (sym, si->Address + pli->base_ofs);
sym->set_aclass_index (LOC_STATIC);
}
if (pli->local_symbols != nullptr)
{
pdb_line_info *pli = (pdb_line_info *) UserContext;
objfile *objfile = pli->objfile;
+ ULONGEST base_ofs = pli->base_ofs;
if (si->Tag == SymTagFunction)
{
- context_stack *newobj = pli->builder->push_context (0, si->Address);
+ ULONGEST addr = si->Address + base_ofs;
+
+ context_stack *newobj = pli->builder->push_context (0, addr);
symbol *sym = new (&objfile->objfile_obstack) symbol;
sym->set_linkage_name (objfile->intern (si->Name));
sym->set_language (language_c, &objfile->objfile_obstack);
sym->set_domain (VAR_DOMAIN);
sym->set_type (get_pdb_type (pli, si->TypeIndex));
sym->set_aclass_index (LOC_BLOCK);
- SET_SYMBOL_VALUE_ADDRESS (sym, si->Address);
+ SET_SYMBOL_VALUE_ADDRESS (sym, addr);
add_symbol_to_list (sym, pli->builder->get_global_symbols ());
newobj->name = sym;
struct context_stack cstk = pli->builder->pop_context ();
pli->builder->finish_block (cstk.name, cstk.old_blocks, cstk.static_link,
- si->Address, si->Address + si->Size);
+ addr, addr + si->Size);
gdbarch_make_symbol_special (objfile->arch (), cstk.name, objfile);
pli->functions.push_back (sym);
{
for (symbol *sym : pli->functions)
{
- if (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) == si->Value)
+ if (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) == si->Value + base_ofs)
{
std::string imp_name
= string_printf ("__thunk_%s", sym->linkage_name ());
static BOOL CALLBACK line_callback(PSRCCODEINFO li, PVOID UserContext)
{
pdb_line_info *pli = (pdb_line_info *) UserContext;
- if (li->Address > pli->max_addr)
- pli->max_addr = li->Address;
+ ULONGEST addr = li->Address + pli->base_ofs;
+ if (addr > pli->max_addr)
+ pli->max_addr = addr;
buildsym_compunit *builder = pli->builder;
subfile *sf = builder->get_current_subfile ();
if (sf == nullptr || strcmp (sf->name, li->FileName) != 0)
builder->start_subfile (li->FileName);
sf = builder->get_current_subfile ();
}
- builder->record_line (sf, li->LineNumber, 0, li->Address, true);
+ builder->record_line (sf, li->LineNumber, 0, addr, true);
return TRUE;
}
-void pdb_load_functions (const char *name, minimal_symbol_reader *reader,
+bool pdb_load_functions (const char *name, minimal_symbol_reader *reader,
struct objfile *objfile);
-void
+bool
pdb_load_functions (const char *name, minimal_symbol_reader *reader,
struct objfile *objfile)
{
- if (!strstr (name, ".exe"))
- return;
-
if (GetModuleHandle("ucrtbase.dll") == NULL)
LoadLibrary("ucrtbase.dll");
HMODULE dh = LoadLibrary("dbghelp.dll");
if (dh == NULL)
- return;
+ return false;
SymInitialize_ftype *fSymInitialize = (SymInitialize_ftype *)
GetProcAddress (dh, "SymInitialize");
GetProcAddress (dh, "SymEnumSymbols");
SymLoadModule64_ftype *fSymLoadModule64 = (SymLoadModule64_ftype *)
GetProcAddress (dh, "SymLoadModule64");
+ SymGetModuleInfo64_ftype *fSymGetModuleInfo64 = (SymGetModuleInfo64_ftype *)
+ GetProcAddress (dh, "SymGetModuleInfo64");
SymEnumSourceLines_ftype *fSymEnumSourceLines = (SymEnumSourceLines_ftype *)
GetProcAddress (dh, "SymEnumSourceLines");
SymGetTypeInfo_ftype *fSymGetTypeInfo = (SymGetTypeInfo_ftype *)
SymSearch_ftype *fSymSearch = (SymSearch_ftype *)
GetProcAddress (dh, "SymSearch");
if (fSymInitialize != NULL && fSymCleanup != NULL
- && fSymLoadModule64 != NULL && fSymFromName != NULL
+ && fSymLoadModule64 != NULL && fSymGetModuleInfo64 != NULL
+ && fSymFromName != NULL
&& fSymEnumTypes != NULL && fSymEnumSymbols != NULL
&& fSymEnumSourceLines != NULL && fSymGetTypeInfo != NULL
&& fSymSetContext != NULL && fSymSearch != NULL)
fSymInitialize (p, NULL, FALSE);
DWORD64 addr = fSymLoadModule64(p, NULL, name, NULL, 0, 0);
+ IMAGEHLP_MODULE64 mi;
+ memset (&mi, 0, sizeof(mi));
+ mi.SizeOfStruct = sizeof(mi);
+ if (!fSymGetModuleInfo64 (p, addr, &mi) || mi.SymType != SymPdb)
+ {
+ fSymCleanup(p);
+ FreeLibrary(dh);
+ return false;
+ }
+
std::unique_ptr<buildsym_compunit> builder;
builder.reset (new buildsym_compunit
(objfile, name, NULL, language_c, addr));
pli.fSymSetContext = fSymSetContext;
pli.fSymSearch = fSymSearch;
pli.addr = addr;
+ pli.base_ofs = objfile->text_section_offset ();
pli.max_addr = 0;
pli.tls_index_sym = nullptr;
}
FreeLibrary(dh);
+
+ return true;
}
void _initialize_check_for_gdb_ini ();