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

编译器/解释器

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. FILE *infile;
  5. long translatelong(long in) { /* translate from little endian to
  6.    local representation */
  7.   long r;
  8.   unsigned char *i;
  9.   i = (unsigned char *)&in;
  10.   r = i[3];
  11.   r = (r << 8) + i[2];
  12.   r = (r << 8) + i[1];
  13.   r = (r << 8) + *i;
  14.   return r;
  15. }
  16.   
  17. int translateshort(short in) {
  18.   int r;
  19.   unsigned char *i;
  20.   i = (unsigned char *)&in;
  21.   r = (i[1] << 8) + *i;
  22.   return r;
  23. }
  24. void print_header(long length) {
  25.   char buf[129],t,s,l;
  26.   long o,ll;
  27.   short rs;
  28.   while (length > 0) {
  29.     fread(&t,1,1,infile);
  30.     switch(t) {
  31.     case 1: /* relocation record */
  32.       fread(&s,1,1,infile);
  33.       fread(&o,4,1,infile);
  34.       fread(&l,1,1,infile);
  35.       fread(&rs,2,1,infile); 
  36.       printf("  relocation: location (%04x:%08lx), length %d, "
  37.      "referred seg %04xn",(int)s,translatelong(o),(int)l,
  38.      translateshort(rs));
  39.       length -= 9;
  40.       break;
  41.     case 2:             /* import record */
  42.       fread(&rs,2,1,infile);
  43.       ll = 0;
  44.       do {
  45. fread(&buf[ll],1,1,infile);
  46.       } while (buf[ll++]);
  47.       printf("  import: segment %04x = %sn",translateshort(rs),buf);
  48.       length -= ll + 3;
  49.       break;
  50.     case 3:             /* export record */
  51.       fread(&s,1,1,infile);
  52.       fread(&o,4,1,infile);
  53.       ll = 0;
  54.       do {
  55. fread(&buf[ll],1,1,infile);
  56.       } while (buf[ll++]);
  57.       printf("  export: (%04x:%08lx) = %sn",(int)s,translatelong(o),buf);
  58.       length -= ll + 6;
  59.       break;
  60.     case 4: /* DLL record */
  61.       ll = 0;
  62.       do {
  63. fread(&buf[ll],1,1,infile);
  64.       } while (buf[ll++]);
  65.       printf("  dll: %sn",buf);
  66.       length -= ll + 1;
  67.       break;
  68.     case 5: /* BSS reservation */
  69.       fread(&ll,4,1,infile);
  70.       printf("  bss reservation: %08lx bytesn",translatelong(ll));
  71.       length -= 5;
  72.       break;
  73.     default:
  74.       printf("  unrecognised record (type %d)n",(int)t);
  75.       length --;
  76.     }
  77.   }
  78. }
  79. int main(int argc,char **argv) {
  80.   char id[7];
  81.   long l;
  82.   int verbose = 0;
  83.   long offset;
  84.   puts("RDOFF Dump utility v1.1 (C) Copyright 1996 Julian R Hall");
  85.   if (argc < 2) {
  86.     fputs("Usage: rdfdump [-v] <filename>n",stderr);
  87.     exit(1);
  88.   }
  89.   if (! strcmp (argv[1], "-v") )
  90.   {
  91.     verbose = 1;
  92.     if (argc < 3)
  93.     {
  94.       fputs("required parameter missingn",stderr);
  95.       exit(1);
  96.     }
  97.     argv++;
  98.   }
  99.   infile = fopen(argv[1],"rb");
  100.   if (! infile) {
  101.     fprintf(stderr,"rdfdump: Could not open %s",argv[1]);
  102.     exit(1);
  103.   }
  104.   fread(id,6,1,infile);
  105.   if (strncmp(id,"RDOFF",5)) {
  106.     fputs("rdfdump: File does not contain valid RDOFF headern",stderr);
  107.     exit(1);
  108.   }
  109.   printf("File %s: RDOFF version %cnn",argv[1],id[5]);
  110.   if (id[5] < '1' || id[5] > '1') {
  111.     fprintf(stderr,"rdfdump: unknown RDOFF version '%c'n",id[5]);
  112.     exit(1);
  113.   }
  114.   fread(&l,4,1,infile);
  115.   l = translatelong(l);
  116.   printf("Header (%ld bytes):n",l);
  117.   print_header(l);
  118.   fread(&l,4,1,infile);
  119.   l = translatelong(l);
  120.   printf("nText segment length = %ld bytesn",l);
  121.   offset = 0;
  122.   while(l--) {
  123.     fread(id,1,1,infile);
  124.     if (verbose) {
  125.       if (offset % 16 == 0)
  126. printf("n%08lx ", offset);
  127.       printf(" %02x",(int) (unsigned char)id[0]);
  128.       offset++;
  129.     }
  130.   }
  131.   if (verbose) printf("nn");
  132.   fread(&l,4,1,infile);
  133.   l = translatelong(l);
  134.   printf("Data segment length = %ld bytesn",l);
  135.   if (verbose)
  136.   {
  137.     offset = 0;
  138.     while (l--) {
  139.       fread(id,1,1,infile);
  140.       if (offset % 16 == 0)
  141. printf("n%08lx ", offset);
  142.       printf(" %02x",(int) (unsigned char) id[0]);
  143.       offset++;
  144.     }
  145.     printf("n");
  146.   }
  147.   fclose(infile);
  148.   return 0;
  149. }