/* authored by Bill Rogers of New Zealand */ #include int c,endfin; FILE *fin; int grabchar() { int t; t=c; endfin = ((c=getc(fin))==EOF); return t; } int grabword() { return ( grabchar()<<8 ) | grabchar(); } int grabthree() { return ( grabchar()<<16 ) | grabword(); } int grablong() { return ( grabword()<<16 ) | grabword(); } dumpdata(n) int n; { int done=-1; while ((n--)>0) { if ( ++done % 4 ==0 ) printf("\n%4x: ",done); printf(" %08x",grablong()); }; printf("\n"); } paddedstring(n) int n; { char ch; for (n=n<<2; n>0; n--) if ((ch=grabchar())!=0) printf("%c",ch); } int codesize, codeaddress; nextcodeword() { codeaddress +=2; return (--codesize)>=0 ? grabword() : 0; } dumpcode(n) int n; { codesize=n*2; codeaddress=0; while (codesize>0) decode(codeaddress); } dumpreloc(b) int b; { int n; printf("\nHunk_Reloc%d\n",b); while ((n=grablong())!=0) { printf("For hunk number %d",grablong()); dumpdata(n); } } dumpsymboldata() { int t,l; while (1) { t=grabchar(); l=grabthree(); if (t==0 & l==0) break; switch (t) { case 0: printf("ext_symb"); break; case 1: printf("ext_def"); break; case 2: printf("ext_abs"); break; case 3: printf("ext_res"); break; case 129: printf("ext_ref32"); break; case 130: printf("ext_common"); break; case 131: printf("ext_ref16"); break; case 132: printf("ext_ref8"); break; }; printf(" '"); paddedstring(l); printf("'"); switch (t) { case 0: case 1: case 2: case 3: printf(" = %08x\n", grablong()); break; case 129: case 131: case 132: dumpdata(grablong()); break; case 130: printf(", size = %d", grablong()); dumpdata(grablong()); break; } } } dumpitem() { int l,f; switch (l=grablong()) { case 999: printf("\nHunk_Unit: '"); paddedstring(grablong()); printf("'\n"); break; case 1000: printf("\nHunk_Name: '"); paddedstring(grablong()); printf("'\n"); break; case 1001: printf("\nHunk_Code\n"); dumpcode(grablong()); break; case 1002: printf("\nHunk_Data"); dumpdata(grablong()); break; case 1003: printf("\nHunk_bss - size = %d\n",grablong()); break; case 1004: dumpreloc(32); break; case 1005: dumpreloc(16); break; case 1006: dumpreloc(8); break; case 1007: printf("\nHunk_Ext\n"); dumpsymboldata(); break; case 1008: printf("\nHunk_Symbol\n"); dumpsymboldata(); break; case 1009: printf("\nHunk_Debug\n"); dumpdata(grablong()); break; case 1010: printf("\nHunk_End\n"); break; case 1011: printf("\nHunk_Header\n"); while ((l=grablong())!=0) { printf("Library: "); paddedstring(l); printf("\n"); }; printf("Table size = %d, using %d to %d\n", grablong(),(f=grablong()),(l=grablong())); for (;f<=l;f++) printf(" Size = %08x\n",grablong()); break; case 1013: printf("\nHunk_Overlay\n Not Yet Implemented\n"); endfin=1; break; case 1014: printf("\nHunk_Break\n"); break; case 1012: default: printf("Not a recognisable structure\n"); endfin=1; } } main(argc,argv) int argc; char *argv[]; { if ( ( fin = fopen( argv[1] , "r" ) ) == NULL ) printf("Couldn't open file >>%s<<\n",argv[1]); else { grabchar(); while (endfin==0) dumpitem(); } }