winedump: Print symbol id when dumping symbols.

In CV records, the cv_itemid is used to reference
other symbols, so we need to print out the symbol id.

Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Eric Pouech 2021-08-24 11:11:43 +02:00 committed by Alexandre Julliard
parent d1e1d80c0e
commit de615a11e5
1 changed files with 61 additions and 60 deletions

View File

@ -1166,6 +1166,8 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
const union codeview_symbol* sym = (const union codeview_symbol*)((const char*)root + i);
length = sym->generic.len + 2;
if (!sym->generic.id || length < 4) break;
printf("\t%04x => ", i + 4); /* ref is made after id and len */
switch (sym->generic.id)
{
/*
@ -1174,7 +1176,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
*/
case S_GDATA32_ST:
case S_LDATA32_ST:
printf("\tS-%s-Data V2 '%s' %04x:%08x type:%08x\n",
printf("%s-Data V2 '%s' %04x:%08x type:%08x\n",
sym->generic.id == S_GDATA32_ST ? "Global" : "Local",
get_symbol_str(p_string(&sym->data_v2.p_name)),
sym->data_v2.segment, sym->data_v2.offset, sym->data_v2.symtype);
@ -1183,7 +1185,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_LDATA32:
case S_GDATA32:
/* EPP case S_DATA32: */
printf("\tS-%s-Data V3 '%s' (%04x:%08x) type:%08x\n",
printf("%s-Data V3 '%s' (%04x:%08x) type:%08x\n",
sym->generic.id == S_GDATA32 ? "Global" : "Local",
get_symbol_str(sym->data_v3.name),
sym->data_v3.segment, sym->data_v3.offset,
@ -1191,21 +1193,21 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_PUB32_16t:
printf("\tS-Public V1 '%s' %04x:%08x flags:%s\n",
printf("Public V1 '%s' %04x:%08x flags:%s\n",
get_symbol_str(p_string(&sym->public_v1.p_name)),
sym->public_v1.segment, sym->public_v1.offset,
get_pubflags(sym->public_v1.pubsymflags));
break;
case S_PUB32_ST:
printf("\tS-Public V2 '%s' %04x:%08x flags:%s\n",
printf("Public V2 '%s' %04x:%08x flags:%s\n",
get_symbol_str(p_string(&sym->public_v2.p_name)),
sym->public_v2.segment, sym->public_v2.offset,
get_pubflags(sym->public_v2.pubsymflags));
break;
case S_PUB32:
printf("\tS-Public V3 '%s' %04x:%08x flags:%s\n",
printf("Public V3 '%s' %04x:%08x flags:%s\n",
get_symbol_str(sym->public_v3.name),
sym->public_v3.segment, sym->public_v3.offset,
get_pubflags(sym->public_v3.pubsymflags));
@ -1214,7 +1216,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_DATAREF:
case S_PROCREF:
case S_LPROCREF:
printf("\tS-%sref V3 '%s' mod:%04x sym:%08x name:%08x\n",
printf("%sref V3 '%s' %04x:%08x name:%08x\n",
sym->generic.id == S_DATAREF ? "Data" :
(sym->generic.id == S_PROCREF ? "Proc" : "Lproc"),
get_symbol_str(sym->refsym2_v3.name),
@ -1227,7 +1229,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
* a PLT slot in the normal jargon that everyone else uses.
*/
case S_THUNK32_ST:
printf("\tS-Thunk V1 '%s' (%04x:%08x#%x) type:%x\n",
printf("Thunk V1 '%s' (%04x:%08x#%x) type:%x\n",
p_string(&sym->thunk_v1.p_name),
sym->thunk_v1.segment, sym->thunk_v1.offset,
sym->thunk_v1.thunk_len, sym->thunk_v1.thtype);
@ -1235,7 +1237,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_THUNK32:
printf("\tS-Thunk V3 '%s' (%04x:%08x#%x) type:%x\n",
printf("Thunk V3 '%s' (%04x:%08x#%x) type:%x\n",
sym->thunk_v3.name,
sym->thunk_v3.segment, sym->thunk_v3.offset,
sym->thunk_v3.thunk_len, sym->thunk_v3.thtype);
@ -1245,13 +1247,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
/* Global and static functions */
case S_GPROC32_16t:
case S_LPROC32_16t:
printf("\tS-%s-Proc V1: '%s' (%04x:%08x#%x) type:%x attr:%x\n",
printf("%s-Proc V1: '%s' (%04x:%08x#%x) type:%x attr:%x\n",
sym->generic.id == S_GPROC32_16t ? "Global" : "-Local",
p_string(&sym->proc_v1.p_name),
sym->proc_v1.segment, sym->proc_v1.offset,
sym->proc_v1.proc_len, sym->proc_v1.proctype,
sym->proc_v1.flags);
printf("\t Debug: start=%08x end=%08x\n",
printf("\t\tDebug: start=%08x end=%08x\n",
sym->proc_v1.debug_start, sym->proc_v1.debug_end);
if (nest_block)
{
@ -1266,13 +1268,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_GPROC32_ST:
case S_LPROC32_ST:
printf("\tS-%s-Proc V2: '%s' (%04x:%08x#%x) type:%x attr:%x\n",
printf("%s-Proc V2: '%s' (%04x:%08x#%x) type:%x attr:%x\n",
sym->generic.id == S_GPROC32_ST ? "Global" : "-Local",
p_string(&sym->proc_v2.p_name),
sym->proc_v2.segment, sym->proc_v2.offset,
sym->proc_v2.proc_len, sym->proc_v2.proctype,
sym->proc_v2.flags);
printf("\t Debug: start=%08x end=%08x\n",
printf("\t\tDebug: start=%08x end=%08x\n",
sym->proc_v2.debug_start, sym->proc_v2.debug_end);
if (nest_block)
{
@ -1287,13 +1289,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_LPROC32:
case S_GPROC32:
printf("\tS-%s-Procedure V3 '%s' (%04x:%08x#%x) type:%x attr:%x\n",
printf("%s-Procedure V3 '%s' (%04x:%08x#%x) type:%x attr:%x\n",
sym->generic.id == S_GPROC32 ? "Global" : "Local",
sym->proc_v3.name,
sym->proc_v3.segment, sym->proc_v3.offset,
sym->proc_v3.proc_len, sym->proc_v3.proctype,
sym->proc_v3.flags);
printf("\t Debug: start=%08x end=%08x\n",
printf("\t\tDebug: start=%08x end=%08x\n",
sym->proc_v3.debug_start, sym->proc_v3.debug_end);
if (nest_block)
{
@ -1308,49 +1310,49 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
/* Function parameters and stack variables */
case S_BPREL32_16t:
printf("\tS-BP-relative V1: '%s' @%d type:%x (%s)\n",
printf("BP-relative V1: '%s' @%d type:%x (%s)\n",
p_string(&sym->stack_v1.p_name),
sym->stack_v1.offset, sym->stack_v1.symtype, curr_func);
break;
case S_BPREL32_ST:
printf("\tS-BP-relative V2: '%s' @%d type:%x (%s)\n",
printf("BP-relative V2: '%s' @%d type:%x (%s)\n",
p_string(&sym->stack_v2.p_name),
sym->stack_v2.offset, sym->stack_v2.symtype, curr_func);
break;
case S_BPREL32:
printf("\tS-BP-relative V3: '%s' @%d type:%x (in %s)\n",
printf("BP-relative V3: '%s' @%d type:%x (in %s)\n",
sym->stack_v3.name, sym->stack_v3.offset,
sym->stack_v3.symtype, curr_func);
break;
case S_REGREL32:
printf("\tS-Reg-relative V3: '%s' @%d type:%x reg:%x (in %s)\n",
printf("Reg-relative V3: '%s' @%d type:%x reg:%x (in %s)\n",
sym->regrel_v3.name, sym->regrel_v3.offset,
sym->regrel_v3.symtype, sym->regrel_v3.reg, curr_func);
break;
case S_REGISTER_16t:
printf("\tS-Register V1 '%s' in %s type:%x register:%x\n",
printf("Register V1 '%s' in %s type:%x register:%x\n",
p_string(&sym->register_v1.p_name),
curr_func, sym->register_v1.reg, sym->register_v1.type);
break;
case S_REGISTER_ST:
printf("\tS-Register V2 '%s' in %s type:%x register:%x\n",
printf("Register V2 '%s' in %s type:%x register:%x\n",
p_string(&sym->register_v2.p_name),
curr_func, sym->register_v2.reg, sym->register_v2.type);
break;
case S_REGISTER:
printf("\tS-Register V3 '%s' in %s type:%x register:%x\n",
printf("Register V3 '%s' in %s type:%x register:%x\n",
sym->register_v3.name,
curr_func, sym->register_v3.reg, sym->register_v3.type);
break;
case S_BLOCK32_ST:
printf("\tS-Block V1 '%s' in '%s' (%04x:%08x#%08x)\n",
printf("Block V1 '%s' in '%s' (%04x:%08x#%08x)\n",
p_string(&sym->block_v1.p_name),
curr_func,
sym->block_v1.segment, sym->block_v1.offset,
@ -1359,7 +1361,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_BLOCK32:
printf("\tS-Block V3 '%s' in '%s' (%04x:%08x#%08x) parent:%u end:%x\n",
printf("Block V3 '%s' in '%s' (%04x:%08x#%08x) parent:%u end:%x\n",
sym->block_v3.name, curr_func,
sym->block_v3.segment, sym->block_v3.offset, sym->block_v3.length,
sym->block_v3.parent, sym->block_v3.end);
@ -1368,7 +1370,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
/* Additional function information */
case S_FRAMEPROC:
printf("\tS-Frame-Info V2: frame-size:%x unk2:%x unk3:%x saved-regs-sz:%x eh(%04x:%08x) flags:%08x\n",
printf("Frame-Info V2: frame-size:%x unk2:%x unk3:%x saved-regs-sz:%x eh(%04x:%08x) flags:%08x\n",
sym->frame_info_v2.sz_frame,
sym->frame_info_v2.unknown2,
sym->frame_info_v2.unknown3,
@ -1379,7 +1381,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_FRAMECOOKIE:
printf("\tSecurity Cookie V3 @%d unk:%x\n",
printf("Security Cookie V3 @%d unk:%x\n",
sym->security_cookie_v3.offset, sym->security_cookie_v3.unknown);
break;
@ -1387,18 +1389,18 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
if (nest_block)
{
nest_block--;
printf("\tS-End-Of block (%u)\n", nest_block);
printf("End-Of block (%u)\n", nest_block);
}
else
{
printf("\tS-End-Of %s\n", curr_func);
printf("End-Of %s\n", curr_func);
free(curr_func);
curr_func = NULL;
}
break;
case S_COMPILE:
printf("\tS-Compile V1 machine:%s lang:%s _unk:%x '%s'\n",
printf("Compile V1 machine:%s lang:%s _unk:%x '%s'\n",
get_machine(sym->compile_v1.machine),
get_language(sym->compile_v1.flags.language),
sym->compile_v1.flags._dome,
@ -1406,7 +1408,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_COMPILE2_ST:
printf("\tS-Compile2-V2 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
printf("Compile2-V2 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile2_v2.flags.iLanguage),
get_machine(sym->compile2_v2.machine),
sym->compile2_v2.flags._dome,
@ -1424,7 +1426,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_COMPILE2:
printf("\tS-Compile2-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
printf("Compile2-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile2_v3.flags.iLanguage),
get_machine(sym->compile2_v3.machine),
sym->compile2_v3.flags._dome,
@ -1442,7 +1444,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_COMPILE3:
printf("\tS-Compile3-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
printf("Compile3-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile3_v3.flags.iLanguage),
get_machine(sym->compile3_v3.machine),
sym->compile3_v3.flags._dome,
@ -1468,23 +1470,23 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_OBJNAME:
printf("\tS-ObjName V3 sig:%x '%s'\n",
printf("ObjName V3 sig:%x '%s'\n",
sym->objname_v3.signature, sym->objname_v3.name);
break;
case S_OBJNAME_ST:
printf("\tS-ObjName V1 sig:%x '%s'\n",
printf("ObjName V1 sig:%x '%s'\n",
sym->objname_v1.signature, p_string(&sym->objname_v1.p_name));
break;
case S_LABEL32_ST:
printf("\tS-Label V1 '%s' in '%s' (%04x:%08x)\n",
printf("Label V1 '%s' in '%s' (%04x:%08x)\n",
p_string(&sym->label_v1.p_name),
curr_func, sym->label_v1.segment, sym->label_v1.offset);
break;
case S_LABEL32:
printf("\tS-Label V3 '%s' in '%s' (%04x:%08x) flag:%x\n",
printf("Label V3 '%s' in '%s' (%04x:%08x) flag:%x\n",
sym->label_v3.name, curr_func, sym->label_v3.segment,
sym->label_v3.offset, sym->label_v3.flags);
break;
@ -1495,7 +1497,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
struct full_value fv;
vlen = full_numeric_leaf(&fv, &sym->constant_v2.cvalue);
printf("\tS-Constant V2 '%s' = %s type:%x\n",
printf("Constant V2 '%s' = %s type:%x\n",
p_string(PSTRING(&sym->constant_v2.cvalue, vlen)),
full_value_string(&fv), sym->constant_v2.type);
}
@ -1507,24 +1509,24 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
struct full_value fv;
vlen = full_numeric_leaf(&fv, &sym->constant_v3.cvalue);
printf("\tS-Constant V3 '%s' = %s type:%x\n",
printf("Constant V3 '%s' = %s type:%x\n",
(const char*)&sym->constant_v3.cvalue + vlen,
full_value_string(&fv), sym->constant_v3.type);
}
break;
case S_UDT_16t:
printf("\tS-Udt V1 '%s': type:0x%x\n",
printf("Udt V1 '%s': type:0x%x\n",
p_string(&sym->udt_v1.p_name), sym->udt_v1.type);
break;
case S_UDT_ST:
printf("\tS-Udt V2 '%s': type:0x%x\n",
printf("Udt V2 '%s': type:0x%x\n",
p_string(&sym->udt_v2.p_name), sym->udt_v2.type);
break;
case S_UDT:
printf("\tS-Udt V3 '%s': type:0x%x\n",
printf("Udt V3 '%s': type:0x%x\n",
sym->udt_v3.name, sym->udt_v3.type);
break;
/*
@ -1533,11 +1535,11 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
* into the symbol length count. We need to skip it.
*/
case S_PROCREF_ST:
printf("\tS-Procref V1 "); goto doaref;
printf("Procref V1 "); goto doaref;
case S_DATAREF_ST:
printf("\tS-Dataref V1 "); goto doaref;
printf("Dataref V1 "); goto doaref;
case S_LPROCREF_ST:
printf("\tS-L-Procref V1 "); goto doaref;
printf("L-Procref V1 "); goto doaref;
doaref:
{
const struct p_string* pname;
@ -1555,12 +1557,12 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_SSEARCH:
printf("\tSSearch V1: (%04x:%08x)\n",
printf("Search V1: (%04x:%08x)\n",
sym->ssearch_v1.segment, sym->ssearch_v1.offset);
break;
case S_SECTION:
printf("\tSSection Info: seg=%04x ?=%04x rva=%08x size=%08x attr=%08x %s\n",
printf("Section Info: seg=%04x ?=%04x rva=%08x size=%08x attr=%08x %s\n",
*(const unsigned short*)((const char*)sym + 4),
*(const unsigned short*)((const char*)sym + 6),
*(const unsigned*)((const char*)sym + 8),
@ -1570,7 +1572,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_COFFGROUP:
printf("\tSSubSection Info: addr=%04x:%08x size=%08x attr=%08x %s\n",
printf("SubSection Info: addr=%04x:%08x size=%08x attr=%08x %s\n",
*(const unsigned short*)((const char*)sym + 16),
*(const unsigned*)((const char*)sym + 12),
*(const unsigned*)((const char*)sym + 4),
@ -1579,13 +1581,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_EXPORT:
printf("\tSEntryPoint: id=%x '%s'\n",
printf("EntryPoint: id=%x '%s'\n",
*(const unsigned*)((const char*)sym + 4), (const char*)sym + 8);
break;
case S_LTHREAD32_16t:
case S_GTHREAD32_16t:
printf("\tS-Thread %s Var V1 '%s' seg=%04x offset=%08x type=%x\n",
printf("Thread %s Var V1 '%s' seg=%04x offset=%08x type=%x\n",
sym->generic.id == S_LTHREAD32_16t ? "global" : "local",
p_string(&sym->thread_v1.p_name),
sym->thread_v1.segment, sym->thread_v1.offset, sym->thread_v1.symtype);
@ -1593,7 +1595,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_LTHREAD32_ST:
case S_GTHREAD32_ST:
printf("\tS-Thread %s Var V2 '%s' seg=%04x offset=%08x type=%x\n",
printf("Thread %s Var V2 '%s' seg=%04x offset=%08x type=%x\n",
sym->generic.id == S_LTHREAD32_ST ? "global" : "local",
p_string(&sym->thread_v2.p_name),
sym->thread_v2.segment, sym->thread_v2.offset, sym->thread_v2.symtype);
@ -1601,57 +1603,56 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
case S_LTHREAD32:
case S_GTHREAD32:
printf("\tS-Thread %s Var V3 '%s' seg=%04x offset=%08x type=%x\n",
printf("Thread %s Var V3 '%s' seg=%04x offset=%08x type=%x\n",
sym->generic.id == S_LTHREAD32 ? "global" : "local", sym->thread_v3.name,
sym->thread_v3.segment, sym->thread_v3.offset, sym->thread_v3.symtype);
break;
case S_LOCAL:
printf("\tS-Local V3 '%s' type=%x flags=%s\n",
printf("Local V3 '%s' type=%x flags=%s\n",
sym->local_v3.name, sym->local_v3.symtype,
get_varflags(sym->local_v3.varflags));
break;
case S_DEFRANGE:
printf("\tS-DefRange dia:%x\n", sym->defrange_v3.program);
printf("DefRange dia:%x\n", sym->defrange_v3.program);
dump_defrange(&sym->defrange_v3.range, get_last(sym), "\t\t");
break;
case S_DEFRANGE_SUBFIELD:
printf("\tS-DefRange-subfield V3 dia:%x off-parent:%x\n",
printf("DefRange-subfield V3 dia:%x off-parent:%x\n",
sym->defrange_subfield_v3.program, sym->defrange_subfield_v3.offParent);
dump_defrange(&sym->defrange_subfield_v3.range, get_last(sym), "\t\t");
break;
case S_DEFRANGE_REGISTER:
printf("\tS-DefRange-register V3 reg:%x attr-unk:%x\n",
printf("DefRange-register V3 reg:%x attr-unk:%x\n",
sym->defrange_register_v3.reg, sym->defrange_register_v3.attr);
dump_defrange(&sym->defrange_register_v3.range, get_last(sym), "\t\t");
break;
case S_DEFRANGE_FRAMEPOINTER_REL:
printf("\tS-DefRange-framepointer-rel V3 offFP:%x\n",
printf("DefRange-framepointer-rel V3 offFP:%x\n",
sym->defrange_frameptrrel_v3.offFramePointer);
dump_defrange(&sym->defrange_frameptrrel_v3.range, get_last(sym), "\t\t");
break;
case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
printf("\tS-DefRange-framepointer-rel-fullscope V3 offFP:%x\n",
printf("DefRange-framepointer-rel-fullscope V3 offFP:%x\n",
sym->defrange_frameptr_relfullscope_v3.offFramePointer);
break;
case S_DEFRANGE_SUBFIELD_REGISTER:
printf("\tS-DefRange-subfield-register V3 reg:%d attr-unk:%x off-parent:%x\n",
printf("DefRange-subfield-register V3 reg:%d attr-unk:%x off-parent:%x\n",
sym->defrange_subfield_register_v3.reg,
sym->defrange_subfield_register_v3.attr,
sym->defrange_subfield_register_v3.offParent);
dump_defrange(&sym->defrange_subfield_register_v3.range, get_last(sym), "\t\t");
break;
case S_DEFRANGE_REGISTER_REL:
printf("\tS-DefRange-register-rel V3 reg:%x off-parent:%x off-BP:%x\n",
printf("DefRange-register-rel V3 reg:%x off-parent:%x off-BP:%x\n",
sym->defrange_registerrel_v3.baseReg, sym->defrange_registerrel_v3.offsetParent,
sym->defrange_registerrel_v3.offBasePointer);
dump_defrange(&sym->defrange_registerrel_v3.range, get_last(sym), "\t\t");
break;
default:
printf(">>> Unsupported symbol-id %x sz=%d\n", sym->generic.id, sym->generic.len + 2);
printf("\n\t\t>>> Unsupported symbol-id %x sz=%d\n", sym->generic.id, sym->generic.len + 2);
dump_data((const void*)sym, sym->generic.len + 2, " ");
}
}