Charles.Forsyth20060303644188019 years agoHistory
298 lines · 4.8 KB · C
RawDownload
#include	<lib9.h>#include	<bio.h>#include	<mach.h> int fd;static void readf(void); static voidusage(char *msg){	fprint(2, "***Error: %s\n", msg);	exits("usage");} static intcget(void){	uchar b[1]; 	if(read(fd, b, 1) != 1){		fprint(2, "bad cget\n");		exits("cget");	}	return b[0];} static inthget(void){	uchar b[2]; 	if(read(fd, b, 2) != 2){		fprint(2, "bad hget\n");		exits("hget");	}	return b[1]<<8 | b[0];} static intlget(void){	uchar b[4]; 	if(read(fd, b, 4) != 4){		fprint(2, "bad lget\n");		exits("lget");	}	return b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0];} static char *sget(char *st){	int i;	static uchar buf[8+1]; 	for(i = 0; i < 8+1; i++)		buf[i] = 0;	if(read(fd, buf, 8) != 8){		fprint(2, "bad sget\n");		exits("sget");	}	if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0)		return st+(buf[7]<<24|buf[6]<<16|buf[5]<<8|buf[4]);	return (char*)buf;}		voidmain(int argc, char	*argv[]){	if (argc != 2)		usage("Wrong number of arguments"); 	fd = open(argv[1], OREAD);	if (fd < 0) {		fprint(2, "5coff: open %s: %r\n", argv[1]);		exits("open");	}	readf();	exits(0);} static voidsection(int i, char *st, int *linoff, int *linn){	int pa, va, sz, off, rel, lin, nrel, nlin, f, res, pno;	char *nm; 	nm = sget(st);	pa = lget();	va = lget();	sz = lget();	off = lget();	rel = lget();	lin = lget();	nrel = lget();	nlin = lget();	f = lget();	res = hget();	pno = hget();	print("sect %d %s: pa=0x%x va=0x%x sz=%d off=%d rel=%d lin=%d nrel=%d nlin=%d f=0x%x res=%d pno=%d\n", i, nm, pa, va, sz, off, rel, lin, nrel, nlin, f, res, pno);	*linoff = lin;	*linn = nlin;} static voidopthdr(void){	int mag, ver, textsz, datasz, bsssz, entry, text, data; 	mag = hget();	ver = hget();	textsz = lget();	datasz = lget();	bsssz = lget();	entry = lget();	text = lget();	data = lget();	print("opt: mag=0x%x ver=%d txtsz=%d datsz=%d bsssz=%d ent=0x%x txt=0x%x dat=0x%x\n", mag, ver, textsz, datasz, bsssz, entry, text, data);} static voidreadhdr(int *o, int *ns, int *sy, int *nsy){	int vid, nsec, date, sym, nsym, opt, f, tid; 	vid = hget();	nsec = hget();	date = lget();	sym = lget();	nsym = lget();	opt = hget();	f = hget();	tid = hget();	print("hdr: vid=0x%x nsect=%d date=%d sym=%d nsym=%d opt=%d f=0x%x tid=0x%x\n", vid, nsec, date, sym, nsym, opt, f, tid);	*o = opt;	*ns = nsec;	*sy = sym;	*nsy = nsym;} static voidreadauxsect(int i){	int sz, nrel, ln; 	sz = lget();	nrel = hget();	ln = hget();	lget();	hget();	lget();	print("sym auxsect %d: sz=%d nrel=%d ln=%d\n", i, sz, nrel, ln);} static voidreadauxfun(int i){	int ind, sz, fpln, nind; 	ind = lget();	sz = lget();	fpln = lget();	nind = lget();	hget();	print("sym auxfun %d: ind=%d sz=%d fpln=%d nind=%d\n", i, ind, sz, fpln, nind);} static voidreadauxbf(int i){	int rsav, lno, lns, fsz, nind; 	rsav = lget();	lno = hget();	lns = hget();	fsz = lget();	nind = lget();	hget();	print("sym auxbf %d: rsav=%x lno=%d lns=%d fsz=%d nind=%d\n", i, rsav, lno, lns, fsz, nind);} static voidreadauxef(int i){	int lno; 	lget();	lno = hget();	lget();	lget();	lget();	print("sym auxef %d: lno=%d\n", i, lno);} static voidreadauxother(int i){	lget();	lget();	hget();	lget();	lget();	print("sym auxother %d\n", i);} static intreadsym(int i, char *st){	int v, s, t, c, aux;	char *nm; 	nm = sget(st);	v = lget();	s = hget();	t = hget();	c = cget();	aux = cget();	print("sym %d %s: val=%d sec=%d type=%d class=%d aux=%d\n", i, nm, v, s, t, c, aux);	if(aux){		i++;		if(strcmp(nm, ".text") == 0 || strcmp(nm, ".data") == 0 || strcmp(nm, ".bss") == 0)			readauxsect(i);		else if(strcmp(nm, ".bf") == 0)			readauxbf(i);		else if(strcmp(nm, ".ef") == 0)			readauxef(i);		else if((t&0x30) == 0x20)	// will do			readauxfun(i);		else			readauxother(i);		return 1;	}	return 0;} static char *readstr(int n){	char *s = malloc(n); 	if(read(fd, s+4, n-4) != n-4){		fprint(2, "bad readstr\n");		exits("sget");	}	return s;} static voidreadln(int i){	int a, l; 	a = lget();	l = hget();	if(l == 0)		print("line %d: sym=%d\n", i, a);	else		print("line %d: addr=0x%x line=%d\n", i, a, l);}	static voidreadf(){	int i, opt, nsec, sym, nsym, stoff, strsz, linoff, nlin, lino, linn;	char *st; 	seek(fd, 0, 0);	readhdr(&opt, &nsec, &sym, &nsym);	if(opt)		opthdr();	stoff = sym+18*nsym;	seek(fd, stoff, 0);	strsz = lget();	st = readstr(strsz);	linoff = nlin = 0;	seek(fd, 22+28, 0);	for(i = 0; i < nsec; i++){		section(i, st, &lino, &linn);		if(linn != 0){			if(nlin == 0){				nlin = linn;				linoff = lino;			}			else				print("multiple line no. tables\n");		}	}	seek(fd, sym, 0);	for(i = 0; i < nsym; i++)		i += readsym(i, st);	print("strsz = %d\n", strsz);	if(nlin != 0){		seek(fd, linoff, 0);		for(i = 0; i < nlin; i++)			readln(i);	}}