diff options
author | H. Peter Anvin <hpa@zytor.com> | 2002-04-30 20:51:32 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2002-04-30 20:51:32 +0000 |
commit | ea6e34db64c7da7cb885197316c6b5e7d048bdb9 (patch) | |
tree | 78e728348f8fe09e394a51c3617e6261de0f4001 /rdoff/rdfdump.c | |
download | nasm-ea6e34db64c7da7cb885197316c6b5e7d048bdb9.tar.gz nasm-ea6e34db64c7da7cb885197316c6b5e7d048bdb9.tar.bz2 nasm-ea6e34db64c7da7cb885197316c6b5e7d048bdb9.zip |
NASM 0.91
Diffstat (limited to 'rdoff/rdfdump.c')
-rw-r--r-- | rdoff/rdfdump.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/rdoff/rdfdump.c b/rdoff/rdfdump.c new file mode 100644 index 0000000..4d4f4df --- /dev/null +++ b/rdoff/rdfdump.c @@ -0,0 +1,156 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +FILE *infile; + +long translatelong(long in) { /* translate from little endian to + local representation */ + long r; + unsigned char *i; + + i = (unsigned char *)∈ + r = i[3]; + r = (r << 8) + i[2]; + r = (r << 8) + i[1]; + r = (r << 8) + *i; + + return r; +} + +int translateshort(short in) { + int r; + unsigned char *i; + + i = (unsigned char *)∈ + r = (i[1] << 8) + *i; + + return r; +} +void print_header(long length) { + unsigned char buf[129],t,s,l; + long o; + short rs; + + while (length > 0) { + fread(&t,1,1,infile); + switch(t) { + case 1: /* relocation record */ + fread(&s,1,1,infile); + fread(&o,4,1,infile); + fread(&l,1,1,infile); + fread(&rs,2,1,infile); + printf(" relocation: location (%04x:%08lx), length %d, " + "referred seg %04x\n",(int)s,translatelong(o),(int)l, + translateshort(rs)); + length -= 9; + break; + case 2: /* import record */ + fread(&rs,2,1,infile); + l = 0; + do { + fread(&buf[l],1,1,infile); + } while (buf[l++]); + printf(" import: segment %04x = %s\n",translateshort(rs),buf); + length -= l + 3; + break; + case 3: /* export record */ + fread(&s,1,1,infile); + fread(&o,4,1,infile); + l = 0; + do { + fread(&buf[l],1,1,infile); + } while (buf[l++]); + printf(" export: (%04x:%08lx) = %s\n",(int)s,translatelong(o),buf); + length -= l + 6; + break; + case 4: /* DLL record */ + l = 0; + do { + fread(&buf[l],1,1,infile); + } while (buf[l++]); + printf(" dll: %s\n",buf); + length -= l + 1; + break; + case 5: /* BSS reservation */ + fread(&l,4,1,infile); + printf(" bss reservation: %08lx bytes\n",translatelong(l)); + length -= 5; + break; + default: + printf(" unrecognised record (type %d)\n",(int)t); + length --; + } + } +} + +int main(int argc,char **argv) { + char id[7]; + long l; + int verbose = 0; + + puts("RDOFF Dump utility v1.1 (C) Copyright 1996 Julian R Hall"); + + if (argc < 2) { + fputs("Usage: rdfdump [-v] <filename>\n",stderr); + exit(1); + } + + if (! strcmp (argv[1], "-v") ) + { + verbose = 1; + if (argc < 3) + { + fputs("required parameter missing\n",stderr); + exit(1); + } + argv++; + } + + infile = fopen(argv[1],"rb"); + if (! infile) { + fprintf(stderr,"rdfdump: Could not open %s",argv[1]); + exit(1); + } + + fread(id,6,1,infile); + if (strncmp(id,"RDOFF",5)) { + fputs("rdfdump: File does not contain valid RDOFF header\n",stderr); + exit(1); + } + + printf("File %s: RDOFF version %c\n\n",argv[1],id[5]); + if (id[5] < '1' || id[5] > '1') { + fprintf(stderr,"rdfdump: unknown RDOFF version '%c'\n",id[5]); + exit(1); + } + + fread(&l,4,1,infile); + l = translatelong(l); + printf("Header (%ld bytes):\n",l); + print_header(l); + + fread(&l,4,1,infile); + l = translatelong(l); + printf("\nText segment length = %ld bytes\n",l); + while(l--) { + fread(id,1,1,infile); + if (verbose) printf(" %02x",(int) (unsigned char)id[0]); + } + if (verbose) printf("\n\n"); + + fread(&l,4,1,infile); + l = translatelong(l); + printf("Data segment length = %ld bytes\n",l); + + if (verbose) + { + while (l--) { + fread(id,1,1,infile); + printf(" %02x",(int) (unsigned char) id[0]); + } + printf("\n"); + } + fclose(infile); + return 0; +} |