]> git.sur5r.net Git - cc65/commitdiff
Added dump of exports and imports
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 30 Jul 2000 21:02:44 +0000 (21:02 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 30 Jul 2000 21:02:44 +0000 (21:02 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@240 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/od65/dump.c
src/od65/dump.h
src/od65/main.c

index d6d1572cc77fea9751cf4d4b360b4828be822849..0c3d743d48eda9c0fadb03cd4686129e92e1a029 100644 (file)
@@ -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);
+    }
+}
+
+
+
index b96e9e8f815660a66865ee536f5609a04a266cfc..aee9842163819cbd5aafb050180503f0ce7c59d1 100644 (file)
@@ -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 */
index 8841bc20c05c2441bf3c258f5d4463456a016667..4faadd0044c5e980904913f352de37c58b4be364 100644 (file)
@@ -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                 },