/* * Dump minix a.out * ++jrb */ #include #include "minix-out.h" main(argc, argv) int argc; char **argv; { void dmp(); if(argc < 2) dmp("a.out"); else { while(--argc) dmp(*++argv); } } #include #ifdef __GNU__ inline #endif void putsym(class, id) int class, id; { register int i = class & 0370; if(i == 0020) putchar(toupper(id)); else putchar(id); if(i == 0030) printf(" static"); putchar('\n'); } void dmp(name) char *name; { register FILE *fp; extern FILE *fopen(); extern void *malloc(); struct aexec head; struct asym *sym, *p; register int i,j; if((fp = fopen(name, "r")) == (FILE *)NULL) { perror(name); exit(1); } printf("%s:\n", name); if(fread(&head, sizeof(head), 1, fp) != 1) { perror(name); exit(2); } if(head.a_magic != CMAGIC) { fprintf(stderr,"%s: bad magic (%lx)\n", name, head.a_magic); exit(3); } printf("\tText %ld\tData %ld\tBss %ld\tSyms %d\n\n", head.a_text, head.a_data, head.a_bss, (int)(head.a_syms/sizeof(struct asym))); if(fseek(fp,(long)(head.a_text + head.a_data), 1)) { perror(name); exit(4); } if((sym = (struct asym *)malloc((unsigned int)head.a_syms)) == NULL) { perror("malloc"); exit(5); } if(fread(sym, (int)(head.a_syms), 1, fp) != 1) { perror(name); exit(6); } fclose(fp); for(p = sym, i = 0; i < head.a_syms/sizeof(struct asym); i++, p++) { printf("\t%d:\t", i); for(j = 0; j < 8; j++) putchar(p->a_name[j]); putchar('\t'); printf("%ld\t", p->a_value); switch(p->a_sclass & 07) { case 0: putsym(p->a_sclass,'u'); break; case 1: putsym(p->a_sclass,'a'); break; case 2: putsym(p->a_sclass,'t'); break; case 3: putsym(p->a_sclass,'d'); break; case 4: putsym(p->a_sclass,'b'); break; case 5: putsym(p->a_sclass,'c'); break; default: printf("unknown class %o\n", p->a_sclass); } } }