Commit 8d096fb5 authored by Andreas Maier's avatar Andreas Maier Committed by Alexandre Julliard

dbghelp: Set correct values in symt_fill_sym_info (SYMBOL_INFO).

parent 3b01149d
...@@ -227,6 +227,7 @@ struct symt_public ...@@ -227,6 +227,7 @@ struct symt_public
struct symt symt; struct symt symt;
struct hash_table_elt hash_elt; struct hash_table_elt hash_elt;
struct symt* container; /* compiland */ struct symt* container; /* compiland */
BOOL is_function;
unsigned long address; unsigned long address;
unsigned long size; unsigned long size;
}; };
...@@ -716,7 +717,9 @@ extern struct symt_public* ...@@ -716,7 +717,9 @@ extern struct symt_public*
symt_new_public(struct module* module, symt_new_public(struct module* module,
struct symt_compiland* parent, struct symt_compiland* parent,
const char* typename, const char* typename,
unsigned long address, unsigned size) DECLSPEC_HIDDEN; BOOL is_function,
unsigned long address,
unsigned size) DECLSPEC_HIDDEN;
extern struct symt_data* extern struct symt_data*
symt_new_global_variable(struct module* module, symt_new_global_variable(struct module* module,
struct symt_compiland* parent, struct symt_compiland* parent,
......
...@@ -927,6 +927,7 @@ static int elf_new_public_symbols(struct module* module, const struct hash_table ...@@ -927,6 +927,7 @@ static int elf_new_public_symbols(struct module* module, const struct hash_table
while ((ste = hash_table_iter_up(&hti))) while ((ste = hash_table_iter_up(&hti)))
{ {
symt_new_public(module, ste->compiland, ste->ht_elt.name, symt_new_public(module, ste->compiland, ste->ht_elt.name,
FALSE,
module->reloc_delta + ste->sym.st_value, module->reloc_delta + ste->sym.st_value,
ste->sym.st_size); ste->sym.st_size);
} }
......
...@@ -2072,6 +2072,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY ...@@ -2072,6 +2072,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY
{ {
symt_new_public(msc_dbg->module, compiland, symt_new_public(msc_dbg->module, compiland,
terminate_string(&sym->public_v1.p_name), terminate_string(&sym->public_v1.p_name),
sym->public_v1.symtype == SYMTYPE_FUNCTION,
codeview_get_address(msc_dbg, sym->public_v1.segment, sym->public_v1.offset), 1); codeview_get_address(msc_dbg, sym->public_v1.segment, sym->public_v1.offset), 1);
} }
break; break;
...@@ -2080,6 +2081,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY ...@@ -2080,6 +2081,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY
{ {
symt_new_public(msc_dbg->module, compiland, symt_new_public(msc_dbg->module, compiland,
terminate_string(&sym->public_v2.p_name), terminate_string(&sym->public_v2.p_name),
sym->public_v2.symtype == SYMTYPE_FUNCTION,
codeview_get_address(msc_dbg, sym->public_v2.segment, sym->public_v2.offset), 1); codeview_get_address(msc_dbg, sym->public_v2.segment, sym->public_v2.offset), 1);
} }
break; break;
...@@ -2089,6 +2091,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY ...@@ -2089,6 +2091,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY
{ {
symt_new_public(msc_dbg->module, compiland, symt_new_public(msc_dbg->module, compiland,
sym->public_v3.name, sym->public_v3.name,
sym->public_v3.symtype == SYMTYPE_FUNCTION,
codeview_get_address(msc_dbg, sym->public_v3.segment, sym->public_v3.offset), 1); codeview_get_address(msc_dbg, sym->public_v3.segment, sym->public_v3.offset), 1);
} }
break; break;
...@@ -2885,7 +2888,7 @@ static BOOL pdb_process_file(const struct process* pcs, ...@@ -2885,7 +2888,7 @@ static BOOL pdb_process_file(const struct process* pcs,
if (ret) if (ret)
{ {
struct pdb_module_info* pdb_info = msc_dbg->module->format_info[DFI_PDB]->u.pdb_info; struct pdb_module_info* pdb_info = msc_dbg->module->format_info[DFI_PDB]->u.pdb_info;
msc_dbg->module->module.SymType = SymCv; msc_dbg->module->module.SymType = SymPdb;
if (pdb_info->pdb_files[0].kind == PDB_JG) if (pdb_info->pdb_files[0].kind == PDB_JG)
msc_dbg->module->module.PdbSig = pdb_info->pdb_files[0].u.jg.timestamp; msc_dbg->module->module.PdbSig = pdb_info->pdb_files[0].u.jg.timestamp;
else else
......
...@@ -442,7 +442,7 @@ static BOOL pe_load_coff_symbol_table(struct module* module) ...@@ -442,7 +442,7 @@ static BOOL pe_load_coff_symbol_table(struct module* module)
source_new(module, NULL, lastfilename)); source_new(module, NULL, lastfilename));
if (!(dbghelp_options & SYMOPT_NO_PUBLICS)) if (!(dbghelp_options & SYMOPT_NO_PUBLICS))
symt_new_public(module, compiland, name, symt_new_public(module, compiland, name, FALSE,
module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress + module->module.BaseOfImage + sect[isym->SectionNumber - 1].VirtualAddress +
isym->Value, isym->Value,
1); 1);
...@@ -635,11 +635,11 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* ...@@ -635,11 +635,11 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module*
#if 0 #if 0
/* Add start of DLL (better use the (yet unimplemented) Exe SymTag for this) */ /* Add start of DLL (better use the (yet unimplemented) Exe SymTag for this) */
/* FIXME: module.ModuleName isn't correctly set yet if it's passed in SymLoadModule */ /* FIXME: module.ModuleName isn't correctly set yet if it's passed in SymLoadModule */
symt_new_public(module, NULL, module->module.ModuleName, base, 1); symt_new_public(module, NULL, module->module.ModuleName, FALSE, base, 1);
#endif #endif
/* Add entry point */ /* Add entry point */
symt_new_public(module, NULL, "EntryPoint", symt_new_public(module, NULL, "EntryPoint", FALSE,
base + nth->OptionalHeader.AddressOfEntryPoint, 1); base + nth->OptionalHeader.AddressOfEntryPoint, 1);
#if 0 #if 0
/* FIXME: we'd better store addresses linked to sections rather than /* FIXME: we'd better store addresses linked to sections rather than
...@@ -650,7 +650,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* ...@@ -650,7 +650,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module*
((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader); ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader);
for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++) for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++)
{ {
symt_new_public(module, NULL, section->Name, symt_new_public(module, NULL, section->Name, FALSE,
RtlImageRvaToVa(nth, mapping, section->VirtualAddress, NULL), 1); RtlImageRvaToVa(nth, mapping, section->VirtualAddress, NULL), 1);
} }
#endif #endif
...@@ -676,6 +676,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* ...@@ -676,6 +676,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module*
if (!names[i]) continue; if (!names[i]) continue;
symt_new_public(module, NULL, symt_new_public(module, NULL,
RtlImageRvaToVa(nth, mapping, names[i], NULL), RtlImageRvaToVa(nth, mapping, names[i], NULL),
FALSE,
base + functions[ordinals[i]], 1); base + functions[ordinals[i]], 1);
} }
...@@ -687,7 +688,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* ...@@ -687,7 +688,7 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module*
if ((ordinals[j] == i) && names[j]) break; if ((ordinals[j] == i) && names[j]) break;
if (j < exports->NumberOfNames) continue; if (j < exports->NumberOfNames) continue;
snprintf(buffer, sizeof(buffer), "%d", i + exports->Base); snprintf(buffer, sizeof(buffer), "%d", i + exports->Base);
symt_new_public(module, NULL, buffer, base + (DWORD)functions[i], 1); symt_new_public(module, NULL, buffer, FALSE, base + (DWORD)functions[i], 1);
} }
} }
} }
......
...@@ -202,6 +202,7 @@ struct symt_compiland* symt_new_compiland(struct module* module, ...@@ -202,6 +202,7 @@ struct symt_compiland* symt_new_compiland(struct module* module,
struct symt_public* symt_new_public(struct module* module, struct symt_public* symt_new_public(struct module* module,
struct symt_compiland* compiland, struct symt_compiland* compiland,
const char* name, const char* name,
BOOL is_function,
unsigned long address, unsigned size) unsigned long address, unsigned size)
{ {
struct symt_public* sym; struct symt_public* sym;
...@@ -217,6 +218,7 @@ struct symt_public* symt_new_public(struct module* module, ...@@ -217,6 +218,7 @@ struct symt_public* symt_new_public(struct module* module,
sym->symt.tag = SymTagPublicSymbol; sym->symt.tag = SymTagPublicSymbol;
sym->hash_elt.name = pool_strdup(&module->pool, name); sym->hash_elt.name = pool_strdup(&module->pool, name);
sym->container = compiland ? &compiland->symt : NULL; sym->container = compiland ? &compiland->symt : NULL;
sym->is_function = is_function;
sym->address = address; sym->address = address;
sym->size = size; sym->size = size;
symt_add_module_ht(module, (struct symt_ht*)sym); symt_add_module_ht(module, (struct symt_ht*)sym);
...@@ -673,11 +675,16 @@ static void symt_fill_sym_info(struct module_pair* pair, ...@@ -673,11 +675,16 @@ static void symt_fill_sym_info(struct module_pair* pair,
} }
break; break;
case SymTagPublicSymbol: case SymTagPublicSymbol:
{
const struct symt_public* pub = (const struct symt_public*)sym;
if (pub->is_function)
sym_info->Flags |= SYMFLAG_PUBLIC_CODE;
else
sym_info->Flags |= SYMFLAG_EXPORT; sym_info->Flags |= SYMFLAG_EXPORT;
symt_get_address(sym, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
}
break; break;
case SymTagFunction: case SymTagFunction:
sym_info->Flags |= SYMFLAG_FUNCTION;
symt_get_address(sym, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
break; break;
case SymTagThunk: case SymTagThunk:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment