/* xsym.c (xsymDec.c) * * Tom Trebisky July, 1999 * * given an a.out format file on stdin, * copy just the symbol table stuff to standard out. */ #include #include #include #include #define BUFSIZE 4096 long long_swap ( long ); void error ( char * ); int fix = 0; int verbose = 0; main() { char buf[BUFSIZE]; struct exec ebuf; long magic, syms, extra; int n; if ( read ( 0, (char *) &ebuf, sizeof(struct exec) ) < 0 ) error ("Cannot read file header"); magic = ebuf.a_magic & 0xffff; if ( verbose ) fprintf(stderr,"magic 1 %04x\n",magic); if ( magic != OMAGIC ) { fix = 1; magic = long_swap ( ebuf.a_magic ) & 0xffff; if ( verbose ) fprintf(stderr,"magic 2 %04x\n",magic); if ( magic != OMAGIC ) error ("Unrecognized file format"); } if ( verbose ) { if ( fix ) fprintf(stderr,"magic number: %08x (swapped)\n",magic); else fprintf(stderr,"magic number: %08x\n",magic); } extra = long_swap(ebuf.a_text) + long_swap(ebuf.a_data) + long_swap(ebuf.a_trsize) + long_swap(ebuf.a_drsize); ebuf.a_text = 0; ebuf.a_data = 0; ebuf.a_bss = 0; ebuf.a_entry = 0; ebuf.a_trsize = 0; ebuf.a_drsize = 0; write ( 1, (char *) &ebuf, sizeof(struct exec) ); if ( lseek ( 0, extra, SEEK_CUR ) < 0 ) error ("Cannot seek"); for ( ;; ) { if ( (n = read ( 0, buf, BUFSIZE )) < 0 ) error ("File read error"); if ( n == 0 ) break; if ( write ( 1, buf, n ) < 0 ) error ("Cannot write syms"); } exit ( 0 ); } void error ( char * msg ) { fprintf(stderr,"%s\n",msg); exit ( 1 ); } #ifdef notdef long short_swap ( long num ) { int b1, b2; long rv; if ( ! fix ) return num; b1 = num & 0xff; num >>= 8; b2 = num & 0xff; return b1<<8 | b2; } #endif long long_swap ( long num ) { int b1, b2, b3, b4; long rv; if ( ! fix ) return num; b1 = num & 0xff; num >>= 8; b2 = num & 0xff; num >>= 8; b3 = num & 0xff; num >>= 8; b4 = num & 0xff; rv = b1; rv <<= 8; rv |= b2; rv <<= 8; rv |= b3; rv <<= 8; rv |= b4; return rv; }