From 3eabe5026f8720be7436457bb9a1d1e7774e8d1e Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 30 Jul 2000 21:02:44 +0000 Subject: [PATCH] Added dump of exports and imports git-svn-id: svn://svn.cc65.org/cc65/trunk@240 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/od65/dump.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++-- src/od65/dump.h | 6 +++ src/od65/main.c | 30 +++++++++++- 3 files changed, 158 insertions(+), 6 deletions(-) diff --git a/src/od65/dump.c b/src/od65/dump.c index d6d1572cc..0c3d743d4 100644 --- a/src/od65/dump.c +++ b/src/od65/dump.c @@ -41,6 +41,7 @@ #include "objdefs.h" #include "optdefs.h" #include "segdefs.h" +#include "symdefs.h" #include "xmalloc.h" /* od65 */ @@ -363,7 +364,7 @@ void DumpObjFiles (FILE* F, unsigned long Offset) Count = Read8 (F); printf (" Count:%27u\n", Count); - /* Read and print all options */ + /* Read and print all files */ for (I = 0; I < Count; ++I) { /* Read the data for one file */ @@ -407,11 +408,11 @@ void DumpObjSegments (FILE* F, unsigned long Offset) /* Output a header */ printf (" Segments:\n"); - /* Read the number of files and print it */ + /* Read the number of segments and print it */ Count = Read8 (F); printf (" Count:%27u\n", Count); - /* Read and print all options */ + /* Read and print all segments */ for (I = 0; I < Count; ++I) { /* Read the data for one segments */ @@ -428,7 +429,7 @@ void DumpObjSegments (FILE* F, unsigned long Offset) case SEGTYPE_ABS: TypeDesc = "SEGTYPE_ABS"; break; case SEGTYPE_ZP: TypeDesc = "SEGTYPE_ZP"; break; case SEGTYPE_FAR: TypeDesc = "SEGTYPE_FAR"; break; - default: TypeDesc = "SEGTYPE_UNKNOWN"; break; + default: TypeDesc = "SEGTYPE_UNKNOWN"; break; } /* Print the header */ @@ -462,3 +463,122 @@ void DumpObjSegments (FILE* F, unsigned long Offset) +void DumpObjImports (FILE* F, unsigned long Offset) +/* Dump the imports in the object file */ +{ + ObjHeader H; + unsigned Count; + unsigned I; + FilePos Pos; + + /* Seek to the header position */ + FileSeek (F, Offset); + + /* Read the header */ + ReadObjHeader (F, &H); + + /* Seek to the start of the options */ + FileSeek (F, Offset + H.ImportOffs); + + /* Output a header */ + printf (" Imports:\n"); + + /* Read the number of imports and print it */ + Count = Read16 (F); + printf (" Count:%27u\n", Count); + + /* Read and print all imports */ + for (I = 0; I < Count; ++I) { + + const char* TypeDesc; + + /* Read the data for one import */ + unsigned char Type = Read8 (F); + char* Name = ReadMallocedStr (F); + unsigned Len = strlen (Name); + ReadFilePos (F, &Pos); + + /* Get a description for the type */ + switch (Type) { + case IMP_ZP: TypeDesc = "IMP_ZP"; break; + case IMP_ABS: TypeDesc = "IMP_ABS"; break; + default: TypeDesc = "IMP_UNKNOWN"; break; + } + + /* Print the header */ + printf (" Index:%27u\n", I); + + /* Print the data */ + printf (" Type:%22s0x%02X (%s)\n", "", Type, TypeDesc); + printf (" Name:%*s\"%s\"\n", 24-Len, "", Name); + + /* Free the Name */ + xfree (Name); + } +} + + + +void DumpObjExports (FILE* F, unsigned long Offset) +/* Dump the exports in the object file */ +{ + ObjHeader H; + unsigned Count; + unsigned I; + FilePos Pos; + + /* Seek to the header position */ + FileSeek (F, Offset); + + /* Read the header */ + ReadObjHeader (F, &H); + + /* Seek to the start of the options */ + FileSeek (F, Offset + H.ExportOffs); + + /* Output a header */ + printf (" Exports:\n"); + + /* Read the number of exports and print it */ + Count = Read16 (F); + printf (" Count:%27u\n", Count); + + /* Read and print all exports */ + for (I = 0; I < Count; ++I) { + + const char* TypeDesc; + + /* Read the data for one export */ + unsigned char Type = Read8 (F); + char* Name = ReadMallocedStr (F); + unsigned Len = strlen (Name); + if (Type & EXP_EXPR) { + SkipExpr (F); + } else { + (void) Read32 (F); + } + ReadFilePos (F, &Pos); + + /* Get a description for the type */ + switch (Type) { + case EXP_ABS|EXP_CONST: TypeDesc = "EXP_ABS,EXP_CONST"; break; + case EXP_ZP|EXP_CONST: TypeDesc = "EXP_ZP,EXP_CONST"; break; + case EXP_ABS|EXP_EXPR: TypeDesc = "EXP_ABS,EXP_EXPR"; break; + case EXP_ZP|EXP_EXPR: TypeDesc = "EXP_ZP,EXP_EXPR"; break; + default: TypeDesc = "EXP_UNKNOWN"; break; + } + + /* Print the header */ + printf (" Index:%27u\n", I); + + /* Print the data */ + printf (" Type:%22s0x%02X (%s)\n", "", Type, TypeDesc); + printf (" Name:%*s\"%s\"\n", 24-Len, "", Name); + + /* Free the Name */ + xfree (Name); + } +} + + + diff --git a/src/od65/dump.h b/src/od65/dump.h index b96e9e8f8..aee984216 100644 --- a/src/od65/dump.h +++ b/src/od65/dump.h @@ -60,6 +60,12 @@ void DumpObjFiles (FILE* F, unsigned long Offset); void DumpObjSegments (FILE* F, unsigned long Offset); /* Dump the segments in the object file */ +void DumpObjImports (FILE* F, unsigned long Offset); +/* Dump the imports in the object file */ + +void DumpObjExports (FILE* F, unsigned long Offset); +/* Dump the exports in the object file */ + /* End of dump.h */ diff --git a/src/od65/main.c b/src/od65/main.c index 8841bc20c..4faadd004 100644 --- a/src/od65/main.c +++ b/src/od65/main.c @@ -77,8 +77,10 @@ static void Usage (void) " -V\t\t\tPrint the version number and exit\n" "\n" "Long options:\n" + " --dump-exports\tDump exported symbols\n" " --dump-files\t\tDump the source files\n" " --dump-header\t\tDump the object file header\n" + " --dump-imports\tDump imported symbols\n" " --dump-options\tDump object file options\n" " --dump-segments\tDump the segments in the file\n" " --help\t\tHelp (this text)\n" @@ -88,6 +90,14 @@ static void Usage (void) +static void OptDumpExports (const char* Opt, const char* Arg) +/* Dump the exported symbols */ +{ + What |= D_EXPORTS; +} + + + static void OptDumpFiles (const char* Opt, const char* Arg) /* Dump the source files */ { @@ -104,6 +114,14 @@ static void OptDumpHeader (const char* Opt, const char* Arg) +static void OptDumpImports (const char* Opt, const char* Arg) +/* Dump the imported symbols */ +{ + What |= D_IMPORTS; +} + + + static void OptDumpOptions (const char* Opt, const char* Arg) /* Dump the object file options */ { @@ -178,11 +196,17 @@ static void DumpFile (const char* Name) } if (What & D_FILES) { DumpObjFiles (F, 0); - } + } if (What & D_SEGMENTS) { DumpObjSegments (F, 0); } - } + if (What & D_IMPORTS) { + DumpObjImports (F, 0); + } + if (What & D_EXPORTS) { + DumpObjExports (F, 0); + } + } /* Close the file */ fclose (F); @@ -195,8 +219,10 @@ int main (int argc, char* argv []) { /* Program long options */ static const LongOpt OptTab[] = { + { "--dump-exports", 0, OptDumpExports }, { "--dump-files", 0, OptDumpFiles }, { "--dump-header", 0, OptDumpHeader }, + { "--dump-imports", 0, OptDumpImports }, { "--dump-options", 0, OptDumpOptions }, { "--dump-segments", 0, OptDumpSegments }, { "--help", 0, OptHelp }, -- 2.39.5