rdfdump.c
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:7k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. FILE *infile;
  5. typedef unsigned short int16;
  6. long translatelong(long in) { /* translate from little endian to
  7.    local representation */
  8.   long r;
  9.   unsigned char *i;
  10.   i = (unsigned char *)&in;
  11.   r = i[3];
  12.   r = (r << 8) + i[2];
  13.   r = (r << 8) + i[1];
  14.   r = (r << 8) + *i;
  15.   return r;
  16. }
  17.   
  18. int translateshort(int16 in) {
  19.   int r;
  20.   unsigned char *i;
  21.   i = (unsigned char *)&in;
  22.   r = (i[1] << 8) + *i;
  23.   return r;
  24. }
  25. void print_header(long length, int rdf_version) {
  26.   char buf[129],t,s,l;
  27.   unsigned char reclen;
  28.   long o,ll;
  29.   int16 rs;
  30.   while (length > 0) {
  31.     fread(&t,1,1,infile);
  32.     if (rdf_version >= 2) {
  33. fread(&reclen,1,1,infile);
  34.     }
  35.     switch(t) {
  36.     case 1: /* relocation record */
  37.     case 6: /* segment relocation */
  38.       fread(&s,1,1,infile);
  39.       fread(&o,4,1,infile);
  40.       fread(&l,1,1,infile);
  41.       fread(&rs,2,1,infile); 
  42.       printf("  %s: location (%04x:%08lx), length %d, "
  43.      "referred seg %04xn", t == 1 ? "relocation" : "seg relocation",
  44.      (int)s,translatelong(o),(int)l,
  45.      translateshort(rs));
  46.       if (rdf_version >= 2 && reclen != 8)
  47.   printf("    warning: reclen != 8n");
  48.       if (rdf_version == 1) length -= 9;
  49.       if (rdf_version == 1 && t == 6)
  50.   printf("    warning: seg relocation not supported in RDOFF1n");
  51.       break;
  52.     case 2:             /* import record */
  53.     case 7: /* import far symbol */
  54.       fread(&rs,2,1,infile);
  55.       ll = 0;
  56.       if (rdf_version == 1) {
  57.   do {
  58.       fread(&buf[ll],1,1,infile);
  59.   } while (buf[ll++]);
  60.       }
  61.       else
  62.       {
  63.   for (;ll < reclen - 2; ll++)
  64.       fread(&buf[ll],1,1,infile);
  65.       }
  66.       printf("  %simport: segment %04x = %sn",t == 7 ? "far " : "",
  67.      translateshort(rs),buf);
  68.       if (rdf_version == 1) length -= ll + 3;
  69.       if (rdf_version == 1 && t == 7)
  70.   printf ("    warning: far import not supported in RDOFF1n");
  71.       break;
  72.     case 3:             /* export record */
  73.       fread(&s,1,1,infile);
  74.       fread(&o,4,1,infile);
  75.       ll = 0;
  76.       if (rdf_version == 1) {
  77.   do {
  78.       fread(&buf[ll],1,1,infile);
  79.   } while (buf[ll++]);
  80.       }
  81.       else
  82.       {
  83.   for (; ll < reclen - 5; ll ++)
  84.       fread(&buf[ll],1,1,infile);
  85.       }
  86.       printf("  export: (%04x:%08lx) = %sn",(int)s,translatelong(o),buf);
  87.       if (rdf_version == 1) length -= ll + 6;
  88.       break;
  89.     case 4: /* DLL record */
  90.       ll = 0;
  91.       if (rdf_version == 1) {
  92.   do {
  93.       fread(&buf[ll],1,1,infile);
  94.   } while (buf[ll++]);
  95.       }
  96.       else
  97.       {
  98.   for (; ll < reclen - 1; ll++)
  99.       fread(&buf[ll],1,1,infile);
  100.       }
  101.       printf("  dll: %sn",buf);
  102.       if (rdf_version == 1) length -= ll + 1;
  103.       break;
  104.     case 5: /* BSS reservation */
  105.       fread(&ll,4,1,infile);
  106.       printf("  bss reservation: %08lx bytesn",translatelong(ll));
  107.       if (rdf_version == 1) length -= 5;
  108.       if (rdf_version > 1 && reclen != 4)
  109.   printf("    warning: reclen != 4n");
  110.       break;
  111.     default:
  112.       printf("  unrecognised record (type %d",(int)t);
  113.       if (rdf_version > 1) printf(", length %d",(int)reclen);
  114.       printf(")n");
  115.       if (rdf_version == 1) length --;
  116.     }
  117.     if (rdf_version != 1) length -= 2 + reclen;
  118.   }
  119. }
  120. char * knowntypes[8] = {"NULL", "text", "data", "object comment",
  121. "linked comment", "loader comment",
  122. "symbolic debug", "line number debug"};
  123. char * translatesegmenttype(int16 type) {
  124.     if (type < 8) return knowntypes[type];
  125.     if (type < 0x0020) return "reserved";
  126.     if (type < 0x1000) return "reserved - moscow";
  127.     if (type < 0x8000) return "reserved - system dependant";
  128.     if (type < 0xFFFF) return "reserved - other";
  129.     if (type == 0xFFFF) return "invalid type code";
  130.     return "type code out of range";
  131. }    
  132. int main(int argc,char **argv) {
  133.   char id[7];
  134.   long l;
  135.   int16 s;
  136.   int verbose = 0;
  137.   long offset;
  138.   int  foundnullsegment = 0;
  139.   int  version;
  140.   long segmentcontentlength = 0;
  141.   int  nsegments = 0;
  142.   long headerlength = 0;
  143.   long objectlength = 0;
  144.   puts("RDOFF Dump utility v2.0 (C) Copyright 1996 Julian R Hall");
  145.   if (argc < 2) {
  146.     fputs("Usage: rdfdump [-v] <filename>n",stderr);
  147.     exit(1);
  148.   }
  149.   if (! strcmp (argv[1], "-v") )
  150.   {
  151.     verbose = 1;
  152.     if (argc < 3)
  153.     {
  154.       fputs("required parameter missingn",stderr);
  155.       exit(1);
  156.     }
  157.     argv++;
  158.   }
  159.   infile = fopen(argv[1],"rb");
  160.   if (! infile) {
  161.     fprintf(stderr,"rdfdump: Could not open %s",argv[1]);
  162.     exit(1);
  163.   }
  164.   fread(id,6,1,infile);
  165.   if (strncmp(id,"RDOFF",5)) {
  166.     fputs("rdfdump: File does not contain valid RDOFF headern",stderr);
  167.     exit(1);
  168.   }
  169.   printf("File %s: RDOFF version %cnn",argv[1],id[5]);
  170.   if (id[5] < '1' || id[5] > '2') {
  171.     fprintf(stderr,"rdfdump: unknown RDOFF version '%c'n",id[5]);
  172.     exit(1);
  173.   }
  174.   version = id[5] - '0';
  175.   if (version > 1) {
  176.       fread(&l, 4, 1, infile);
  177.       objectlength = translatelong(l);
  178.       printf("Object content size: %ld bytesn", objectlength);
  179.   }
  180.   fread(&l,4,1,infile);
  181.   headerlength = translatelong(l);
  182.   printf("Header (%ld bytes):n",headerlength);
  183.   print_header(headerlength, version);
  184.   if (version == 1) {
  185.       fread(&l,4,1,infile);
  186.       l = translatelong(l);
  187.       printf("nText segment length = %ld bytesn",l);
  188.       offset = 0;
  189.       while(l--) {
  190.   fread(id,1,1,infile);
  191.   if (verbose) {
  192.       if (offset % 16 == 0)
  193.   printf("n%08lx ", offset);
  194.       printf(" %02x",(int) (unsigned char)id[0]);
  195.       offset++;
  196.   }
  197.       }
  198.       if (verbose) printf("nn");
  199.       
  200.       fread(&l,4,1,infile);
  201.       l = translatelong(l);
  202.       printf("Data segment length = %ld bytesn",l);
  203.       if (verbose)
  204.       {
  205.   offset = 0;
  206.   while (l--) {
  207.       fread(id,1,1,infile);
  208.       if (offset % 16 == 0)
  209.   printf("n%08lx ", offset);
  210.       printf(" %02x",(int) (unsigned char) id[0]);
  211.       offset++;
  212.   }
  213.   printf("n");
  214.       }
  215.   }
  216.   else
  217.   {
  218.       do {
  219.   fread(&s,2,1,infile);
  220.   s = translateshort(s);
  221.   if (!s) {
  222.       printf("nNULL segmentn");
  223.       foundnullsegment = 1;
  224.       break;
  225.   }
  226.   printf("nSegment:n  Type   = %04X (%s)n",(int)s,
  227.  translatesegmenttype(s));
  228.   nsegments++;
  229.   fread(&s,2,1,infile);
  230.   printf("  Number = %04Xn",(int)translateshort(s));
  231.   fread(&s,2,1,infile);
  232.   printf("  Resrvd = %04Xn",(int)translateshort(s));
  233.   fread(&l,4,1,infile);
  234.   l = translatelong(l);
  235.   printf("  Length = %ld bytesn",l);
  236.   segmentcontentlength += l;
  237.   offset = 0;
  238.   while(l--) {
  239.       fread(id,1,1,infile);
  240.       if (verbose) {
  241.   if (offset % 16 == 0)
  242.       printf("n%08lx ", offset);
  243.   printf(" %02x",(int) (unsigned char)id[0]);
  244.   offset++;
  245.       }
  246.   }
  247.   if (verbose) printf("n");
  248.       } while (!feof(infile));
  249.       if (! foundnullsegment)
  250.   printf("nWarning: unexpected end of file - "
  251.  "NULL segment not foundn");
  252.       printf("nTotal number of segments: %dn", nsegments);
  253.       printf("Total segment content length: %ld bytesn",segmentcontentlength);
  254.       /* calculate what the total object content length should have been */
  255.       l = segmentcontentlength + 10 * (nsegments+1) + headerlength + 4;
  256.       if (l != objectlength)
  257.   printf("Warning: actual object length (%ld) != "
  258.  "stored object length (%ld)n", l, objectlength);
  259.   }
  260.   fclose(infile);
  261.   return 0;
  262. }