[PATCH 1/3] [WineDump]: rewrote a bit the COFF symbol table stuff
Eric Pouech
eric.pouech at orange.fr
Wed Dec 9 13:55:07 CST 2009
- create a dedicated helper
- dump all symbols (not only functions, or symbols out of #1 section)
- print labels as well
A+
---
tools/winedump/debug.c | 106 ++++++++++++++++++++++++------------------------
1 files changed, 54 insertions(+), 52 deletions(-)
diff --git a/tools/winedump/debug.c b/tools/winedump/debug.c
index be8150f..b02c6d9 100644
--- a/tools/winedump/debug.c
+++ b/tools/winedump/debug.c
@@ -512,70 +512,72 @@ static const char *get_coff_name( const IMAGE_SYMBOL *coff_sym, const char *coff
return nampnt;
}
-void dump_coff(unsigned long coffbase, unsigned long len, const void* pmt)
+static const char* storage_class(int sc)
+{
+ static char tmp[7];
+ switch (sc)
+ {
+ case IMAGE_SYM_CLASS_STATIC: return "static";
+ case IMAGE_SYM_CLASS_EXTERNAL: return "extrnl";
+ case IMAGE_SYM_CLASS_LABEL: return "label ";
+ }
+ sprintf(tmp, "#%d", sc);
+ return tmp;
+}
+
+void dump_coff_symbol_table(const IMAGE_SYMBOL *coff_symbols, unsigned num_sym,
+ const IMAGE_SECTION_HEADER *sectHead)
{
- const IMAGE_COFF_SYMBOLS_HEADER *coff = PRD(coffbase, len);
const IMAGE_SYMBOL *coff_sym;
- const IMAGE_SYMBOL *coff_symbols =
- (const IMAGE_SYMBOL *) ((const char *)coff + coff->LvaToFirstSymbol);
- const char *coff_strtab = (const char *) (coff_symbols + coff->NumberOfSymbols);
- const IMAGE_SECTION_HEADER *sectHead = pmt;
+ const char *coff_strtab = (const char *) (coff_symbols + num_sym);
unsigned int i;
const char *nampnt;
int naux;
- printf("\nDebug table: COFF format. modbase %p, coffbase %p\n", PRD(0, 0), coff);
- printf(" ID | seg:offs [ abs ] | symbol/function name\n");
- for(i=0; i < coff->NumberOfSymbols; i++ )
+ printf("\nDebug table: COFF format.\n");
+ printf(" ID | seg:offs [ abs ] | Kind | symbol/function name\n");
+ for (i=0; i < num_sym; i++)
{
- coff_sym = coff_symbols + i;
- naux = coff_sym->NumberOfAuxSymbols;
-
- if( coff_sym->StorageClass == IMAGE_SYM_CLASS_FILE )
- {
- printf("file %s\n", (const char *) (coff_sym + 1));
- i += naux;
- continue;
- }
-
- if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_STATIC)
- && (naux == 0)
- && (coff_sym->SectionNumber == 1) )
- {
- DWORD base = sectHead[coff_sym->SectionNumber - 1].VirtualAddress;
- /*
- * This is a normal static function when naux == 0.
- * Just register it. The current file is the correct
- * one in this instance.
- */
- nampnt = get_coff_name( coff_sym, coff_strtab );
-
- printf("%05d | %02d:%08x [%08x] | %s\n", i, coff_sym->SectionNumber - 1, coff_sym->Value - base, coff_sym->Value, nampnt);
- i += naux;
- continue;
- }
+ coff_sym = coff_symbols + i;
+ naux = coff_sym->NumberOfAuxSymbols;
- if( (coff_sym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL)
- && ISFCN(coff_sym->Type)
- && (coff_sym->SectionNumber > 0) )
+ switch (coff_sym->StorageClass)
{
- DWORD base = sectHead[coff_sym->SectionNumber - 1].VirtualAddress;
-
- nampnt = get_coff_name( coff_sym, coff_strtab );
+ case IMAGE_SYM_CLASS_FILE:
+ printf("file %s\n", (const char *) (coff_sym + 1));
+ break;
+ case IMAGE_SYM_CLASS_STATIC:
+ case IMAGE_SYM_CLASS_EXTERNAL:
+ case IMAGE_SYM_CLASS_LABEL:
+ if (coff_sym->SectionNumber > 0)
+ {
+ DWORD base = sectHead[coff_sym->SectionNumber - 1].VirtualAddress;
+ nampnt = get_coff_name( coff_sym, coff_strtab );
- /* FIXME: add code to find out the file this symbol belongs to,
- * see winedbg */
- printf("%05d | %02d:%08x [%08x] | %s\n", i, coff_sym->SectionNumber - 1, coff_sym->Value - base, coff_sym->Value, nampnt);
- i += naux;
- continue;
- }
+ printf("%05d | %02d:%08x [%08x] | %s | %s\n",
+ i, coff_sym->SectionNumber - 1, coff_sym->Value,
+ base + coff_sym->Value,
+ storage_class(coff_sym->StorageClass), nampnt);
+ }
+ break;
+ default:
+ printf("%05d | %s\n", i, storage_class(coff_sym->StorageClass));
+ }
+ /*
+ * For now, skip past the aux entries.
+ */
+ i += naux;
+ }
+}
- /*
- * For now, skip past the aux entries.
- */
- i += naux;
+void dump_coff(unsigned long coffbase, unsigned long len, const void* pmt)
+{
+ const IMAGE_COFF_SYMBOLS_HEADER *coff = PRD(coffbase, len);
+ const IMAGE_SYMBOL *coff_symbols =
+ (const IMAGE_SYMBOL *) ((const char *)coff + coff->LvaToFirstSymbol);
+ const IMAGE_SECTION_HEADER *sectHead = pmt;
- }
+ dump_coff_symbol_table(coff_symbols, coff->NumberOfSymbols, sectHead);
}
void dump_codeview(unsigned long base, unsigned long len)
More information about the wine-patches
mailing list