home *** CD-ROM | disk | FTP | other *** search
- /*
- * Dump minix a.out
- * ++jrb
- */
- #include <stdio.h>
- #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 <ctype.h>
- #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);
- }
- }
- }
-
-
-
-
-
-