From 9a3d983659229a0708022d918cd592c145e689b2 Mon Sep 17 00:00:00 2001 From: ceriel Date: Wed, 11 Mar 1987 17:12:23 +0000 Subject: [PATCH] Initial revision --- util/amisc/ashow.c | 214 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 util/amisc/ashow.c diff --git a/util/amisc/ashow.c b/util/amisc/ashow.c new file mode 100644 index 000000000..09d67b215 --- /dev/null +++ b/util/amisc/ashow.c @@ -0,0 +1,214 @@ +static char rcsid[] = "$Header$"; +/* + * show - make the contents of an ACK object file human readable. + */ + +#include +#include +#include +#include + +#define OK 0 /* Return value of gethead if Orl Korekt. */ +#define BMASK 0xFF /* To extract least significant 8 bits from an int. */ + +/* ARGSUSED */ +main(argc, argv) + int argc; + char *argv[]; +# define prog argv[0] +{ + register char **arg = argv; + struct outhead header; + + while (*++arg) { + if (! rd_open(*arg)) { + error("%s: cannot read %s\n", prog, *arg); + continue; + } + rd_ohead(&header); + if (BADMAGIC(header)) { + error("%s: %s not an ACK object file\n", prog, *arg); + } else { + printf("%s:\n", *arg); + show(&header); + } + rd_close(); + } +} + +/* + * Read an ACK object file from `fp' and show it in a human readable way. + * NB. The header has already been read and is in the struct outhead `headp' + * points to. + */ +show(headp) + register struct outhead *headp; +{ + register int i; + register struct outname *np; + register struct outname *name; /* Dynamically allocated name-array. */ + register char *string;/* Base of string area. */ + extern char *myalloc(); + + printf("Version %d\n", headp->oh_stamp); + showflags(headp->oh_flags); + /* + * Show all sections. + */ + for (i = 0; i < headp->oh_nsect; i++) { + printf("Section %d:\n", i); + showsect(); + } + /* + * Show relocation information. + */ + for (i = 0; i < headp->oh_nrelo; i++) { + printf("Relocation record %d:\n", i); + showrelo(); + } + /* + * We get all struct outname's and the strings in core first. + */ + name = (struct outname *) myalloc(headp->oh_nname * SZ_NAME); + string = myalloc((unsigned) headp->oh_nchar); + for (np = &name[0]; np < &name[headp->oh_nname]; np++) { + rd_name(np, 1); + if (np->on_foff != 0) + np->on_mptr = string + np->on_foff - OFF_CHAR(*headp); +/* Weird: ^^^^^^^^^^^^^^^^^^^ */ + } + /* + * Transfer strings from file to core. + */ + rd_string(string, headp->oh_nchar); + /* + * Now we can show all names. + */ + for (np = &name[0]; np < &name[headp->oh_nname]; np++) { + printf("Name %d:\n", np - name); + showname(np); + } +} + +/* + * Show flags from header. + */ +showflags(flagword) + ushort flagword; +{ + if (flagword & HF_LINK) printf("unresolved references left\n"); +} + +/* + * Show a section. + */ +showsect() +{ + struct outsect section; + + rd_sect(§ion, 1); + printf("\tstartaddress in machine\t%ld\n", section.os_base); + printf("\tsection size in machine\t%ld\n", section.os_size); + printf("\tstartaddress in file\t%ld\n", section.os_foff); + printf("\tsection size in file\t%ld\n", section.os_flen); + printf("\tsection alignment\t%ld\n", section.os_lign); +} + +/* + * Show a relocation record. + */ +showrelo() +{ + struct outrelo relrec; + + rd_relo(&relrec, 1); + switch (relrec.or_type & RELSZ) { + case RELO1: + printf("\t1 byte\n"); + break; + case RELO2: + printf("\t2 bytes\n"); + break; + case RELO4: + printf("\t4 bytes\n"); + break; + default: + error("\tunexpected relocation length\n"); + break; + } + if (relrec.or_type & RELPC) printf("\tpc relative\n"); + if (relrec.or_type & RELBR) printf("\tbytes reversed\n"); + if (relrec.or_type & RELWR) printf("\twords reversed\n"); + printf("\treferencing section\t%d\n", (relrec.or_sect & BMASK) - S_MIN); + printf("\treferenced symbol index\t%d\n", relrec.or_nami); + printf("\treferencing address\t%ld\n", relrec.or_addr); +} + +/* + * Show the name in the struct `namep' points to. + */ +showname(namep) + struct outname *namep; +{ + if (namep->on_mptr) + printf("\t%s\n", namep->on_mptr); + else + printf("\tno name\n"); + switch (namep->on_type & S_TYP) { + case S_UND: + printf("\tundefined\n"); + break; + case S_ABS: + printf("\tabsolute\n"); + break; + default: + printf("\tin section %ld\n", (namep->on_type & S_TYP) - S_MIN); + break; + } + if (namep->on_type & S_EXT) printf("\texternal\n"); + switch (namep->on_type & S_ETC) { + case S_SCT: + printf("\tsection name\n"); break; + case S_LIN: + printf("\thll source line item\n"); break; + case S_FIL: + printf("\thll source file item\n"); break; + case S_MOD: + printf("\tass src file item\n"); break; + case S_COM: + printf("\tcommon\n"); break; + } + printf("\tvalue %ld\n", namep->on_valu); +} + +/* + * Core allocation via malloc() but fatal if no core. + */ +char * +myalloc(u) + unsigned int u; +{ + register char *rcp; + extern char *malloc(); + + rcp = malloc(u); + if (rcp == (char *) 0) { + error("Out of core\n"); + exit(1); + } + return rcp; +} + +/* VARARGS1 */ +error(s, a1, a2, a3, a4) + char *s; +{ + fflush(stdout); + fprintf(stderr, s, a1, a2, a3, a4); +} + +rd_fatal() +{ + error("Error in reading the object file\n"); + exit(1); +} -- 2.34.1