xref: /inferno-os/utils/5coff/readcoff.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include	<lib9.h>
2*74a4d8c2SCharles.Forsyth #include	<bio.h>
3*74a4d8c2SCharles.Forsyth #include	<mach.h>
4*74a4d8c2SCharles.Forsyth 
5*74a4d8c2SCharles.Forsyth int fd;
6*74a4d8c2SCharles.Forsyth static void readf(void);
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth static void
usage(char * msg)9*74a4d8c2SCharles.Forsyth usage(char *msg)
10*74a4d8c2SCharles.Forsyth {
11*74a4d8c2SCharles.Forsyth 	fprint(2, "***Error: %s\n", msg);
12*74a4d8c2SCharles.Forsyth 	exits("usage");
13*74a4d8c2SCharles.Forsyth }
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth static int
cget(void)16*74a4d8c2SCharles.Forsyth cget(void)
17*74a4d8c2SCharles.Forsyth {
18*74a4d8c2SCharles.Forsyth 	uchar b[1];
19*74a4d8c2SCharles.Forsyth 
20*74a4d8c2SCharles.Forsyth 	if(read(fd, b, 1) != 1){
21*74a4d8c2SCharles.Forsyth 		fprint(2, "bad cget\n");
22*74a4d8c2SCharles.Forsyth 		exits("cget");
23*74a4d8c2SCharles.Forsyth 	}
24*74a4d8c2SCharles.Forsyth 	return b[0];
25*74a4d8c2SCharles.Forsyth }
26*74a4d8c2SCharles.Forsyth 
27*74a4d8c2SCharles.Forsyth static int
hget(void)28*74a4d8c2SCharles.Forsyth hget(void)
29*74a4d8c2SCharles.Forsyth {
30*74a4d8c2SCharles.Forsyth 	uchar b[2];
31*74a4d8c2SCharles.Forsyth 
32*74a4d8c2SCharles.Forsyth 	if(read(fd, b, 2) != 2){
33*74a4d8c2SCharles.Forsyth 		fprint(2, "bad hget\n");
34*74a4d8c2SCharles.Forsyth 		exits("hget");
35*74a4d8c2SCharles.Forsyth 	}
36*74a4d8c2SCharles.Forsyth 	return b[1]<<8 | b[0];
37*74a4d8c2SCharles.Forsyth }
38*74a4d8c2SCharles.Forsyth 
39*74a4d8c2SCharles.Forsyth static int
lget(void)40*74a4d8c2SCharles.Forsyth lget(void)
41*74a4d8c2SCharles.Forsyth {
42*74a4d8c2SCharles.Forsyth 	uchar b[4];
43*74a4d8c2SCharles.Forsyth 
44*74a4d8c2SCharles.Forsyth 	if(read(fd, b, 4) != 4){
45*74a4d8c2SCharles.Forsyth 		fprint(2, "bad lget\n");
46*74a4d8c2SCharles.Forsyth 		exits("lget");
47*74a4d8c2SCharles.Forsyth 	}
48*74a4d8c2SCharles.Forsyth 	return b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0];
49*74a4d8c2SCharles.Forsyth }
50*74a4d8c2SCharles.Forsyth 
51*74a4d8c2SCharles.Forsyth static char *
sget(char * st)52*74a4d8c2SCharles.Forsyth sget(char *st)
53*74a4d8c2SCharles.Forsyth {
54*74a4d8c2SCharles.Forsyth 	int i;
55*74a4d8c2SCharles.Forsyth 	static uchar buf[8+1];
56*74a4d8c2SCharles.Forsyth 
57*74a4d8c2SCharles.Forsyth 	for(i = 0; i < 8+1; i++)
58*74a4d8c2SCharles.Forsyth 		buf[i] = 0;
59*74a4d8c2SCharles.Forsyth 	if(read(fd, buf, 8) != 8){
60*74a4d8c2SCharles.Forsyth 		fprint(2, "bad sget\n");
61*74a4d8c2SCharles.Forsyth 		exits("sget");
62*74a4d8c2SCharles.Forsyth 	}
63*74a4d8c2SCharles.Forsyth 	if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0)
64*74a4d8c2SCharles.Forsyth 		return st+(buf[7]<<24|buf[6]<<16|buf[5]<<8|buf[4]);
65*74a4d8c2SCharles.Forsyth 	return (char*)buf;
66*74a4d8c2SCharles.Forsyth }
67*74a4d8c2SCharles.Forsyth 
68*74a4d8c2SCharles.Forsyth void
main(int argc,char * argv[])69*74a4d8c2SCharles.Forsyth main(int argc, char	*argv[])
70*74a4d8c2SCharles.Forsyth {
71*74a4d8c2SCharles.Forsyth 	if (argc != 2)
72*74a4d8c2SCharles.Forsyth 		usage("Wrong number of arguments");
73*74a4d8c2SCharles.Forsyth 
74*74a4d8c2SCharles.Forsyth 	fd = open(argv[1], OREAD);
75*74a4d8c2SCharles.Forsyth 	if (fd < 0) {
76*74a4d8c2SCharles.Forsyth 		fprint(2, "5coff: open %s: %r\n", argv[1]);
77*74a4d8c2SCharles.Forsyth 		exits("open");
78*74a4d8c2SCharles.Forsyth 	}
79*74a4d8c2SCharles.Forsyth 	readf();
80*74a4d8c2SCharles.Forsyth 	exits(0);
81*74a4d8c2SCharles.Forsyth }
82*74a4d8c2SCharles.Forsyth 
83*74a4d8c2SCharles.Forsyth static void
section(int i,char * st,int * linoff,int * linn)84*74a4d8c2SCharles.Forsyth section(int i, char *st, int *linoff, int *linn)
85*74a4d8c2SCharles.Forsyth {
86*74a4d8c2SCharles.Forsyth 	int pa, va, sz, off, rel, lin, nrel, nlin, f, res, pno;
87*74a4d8c2SCharles.Forsyth 	char *nm;
88*74a4d8c2SCharles.Forsyth 
89*74a4d8c2SCharles.Forsyth 	nm = sget(st);
90*74a4d8c2SCharles.Forsyth 	pa = lget();
91*74a4d8c2SCharles.Forsyth 	va = lget();
92*74a4d8c2SCharles.Forsyth 	sz = lget();
93*74a4d8c2SCharles.Forsyth 	off = lget();
94*74a4d8c2SCharles.Forsyth 	rel = lget();
95*74a4d8c2SCharles.Forsyth 	lin = lget();
96*74a4d8c2SCharles.Forsyth 	nrel = lget();
97*74a4d8c2SCharles.Forsyth 	nlin = lget();
98*74a4d8c2SCharles.Forsyth 	f = lget();
99*74a4d8c2SCharles.Forsyth 	res = hget();
100*74a4d8c2SCharles.Forsyth 	pno = hget();
101*74a4d8c2SCharles.Forsyth 	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);
102*74a4d8c2SCharles.Forsyth 	*linoff = lin;
103*74a4d8c2SCharles.Forsyth 	*linn = nlin;
104*74a4d8c2SCharles.Forsyth }
105*74a4d8c2SCharles.Forsyth 
106*74a4d8c2SCharles.Forsyth static void
opthdr(void)107*74a4d8c2SCharles.Forsyth opthdr(void)
108*74a4d8c2SCharles.Forsyth {
109*74a4d8c2SCharles.Forsyth 	int mag, ver, textsz, datasz, bsssz, entry, text, data;
110*74a4d8c2SCharles.Forsyth 
111*74a4d8c2SCharles.Forsyth 	mag = hget();
112*74a4d8c2SCharles.Forsyth 	ver = hget();
113*74a4d8c2SCharles.Forsyth 	textsz = lget();
114*74a4d8c2SCharles.Forsyth 	datasz = lget();
115*74a4d8c2SCharles.Forsyth 	bsssz = lget();
116*74a4d8c2SCharles.Forsyth 	entry = lget();
117*74a4d8c2SCharles.Forsyth 	text = lget();
118*74a4d8c2SCharles.Forsyth 	data = lget();
119*74a4d8c2SCharles.Forsyth 	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);
120*74a4d8c2SCharles.Forsyth }
121*74a4d8c2SCharles.Forsyth 
122*74a4d8c2SCharles.Forsyth static void
readhdr(int * o,int * ns,int * sy,int * nsy)123*74a4d8c2SCharles.Forsyth readhdr(int *o, int *ns, int *sy, int *nsy)
124*74a4d8c2SCharles.Forsyth {
125*74a4d8c2SCharles.Forsyth 	int vid, nsec, date, sym, nsym, opt, f, tid;
126*74a4d8c2SCharles.Forsyth 
127*74a4d8c2SCharles.Forsyth 	vid = hget();
128*74a4d8c2SCharles.Forsyth 	nsec = hget();
129*74a4d8c2SCharles.Forsyth 	date = lget();
130*74a4d8c2SCharles.Forsyth 	sym = lget();
131*74a4d8c2SCharles.Forsyth 	nsym = lget();
132*74a4d8c2SCharles.Forsyth 	opt = hget();
133*74a4d8c2SCharles.Forsyth 	f = hget();
134*74a4d8c2SCharles.Forsyth 	tid = hget();
135*74a4d8c2SCharles.Forsyth 	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);
136*74a4d8c2SCharles.Forsyth 	*o = opt;
137*74a4d8c2SCharles.Forsyth 	*ns = nsec;
138*74a4d8c2SCharles.Forsyth 	*sy = sym;
139*74a4d8c2SCharles.Forsyth 	*nsy = nsym;
140*74a4d8c2SCharles.Forsyth }
141*74a4d8c2SCharles.Forsyth 
142*74a4d8c2SCharles.Forsyth static void
readauxsect(int i)143*74a4d8c2SCharles.Forsyth readauxsect(int i)
144*74a4d8c2SCharles.Forsyth {
145*74a4d8c2SCharles.Forsyth 	int sz, nrel, ln;
146*74a4d8c2SCharles.Forsyth 
147*74a4d8c2SCharles.Forsyth 	sz = lget();
148*74a4d8c2SCharles.Forsyth 	nrel = hget();
149*74a4d8c2SCharles.Forsyth 	ln = hget();
150*74a4d8c2SCharles.Forsyth 	lget();
151*74a4d8c2SCharles.Forsyth 	hget();
152*74a4d8c2SCharles.Forsyth 	lget();
153*74a4d8c2SCharles.Forsyth 	print("sym auxsect %d: sz=%d nrel=%d ln=%d\n", i, sz, nrel, ln);
154*74a4d8c2SCharles.Forsyth }
155*74a4d8c2SCharles.Forsyth 
156*74a4d8c2SCharles.Forsyth static void
readauxfun(int i)157*74a4d8c2SCharles.Forsyth readauxfun(int i)
158*74a4d8c2SCharles.Forsyth {
159*74a4d8c2SCharles.Forsyth 	int ind, sz, fpln, nind;
160*74a4d8c2SCharles.Forsyth 
161*74a4d8c2SCharles.Forsyth 	ind = lget();
162*74a4d8c2SCharles.Forsyth 	sz = lget();
163*74a4d8c2SCharles.Forsyth 	fpln = lget();
164*74a4d8c2SCharles.Forsyth 	nind = lget();
165*74a4d8c2SCharles.Forsyth 	hget();
166*74a4d8c2SCharles.Forsyth 	print("sym auxfun %d: ind=%d sz=%d fpln=%d nind=%d\n", i, ind, sz, fpln, nind);
167*74a4d8c2SCharles.Forsyth }
168*74a4d8c2SCharles.Forsyth 
169*74a4d8c2SCharles.Forsyth static void
readauxbf(int i)170*74a4d8c2SCharles.Forsyth readauxbf(int i)
171*74a4d8c2SCharles.Forsyth {
172*74a4d8c2SCharles.Forsyth 	int rsav, lno, lns, fsz, nind;
173*74a4d8c2SCharles.Forsyth 
174*74a4d8c2SCharles.Forsyth 	rsav = lget();
175*74a4d8c2SCharles.Forsyth 	lno = hget();
176*74a4d8c2SCharles.Forsyth 	lns = hget();
177*74a4d8c2SCharles.Forsyth 	fsz = lget();
178*74a4d8c2SCharles.Forsyth 	nind = lget();
179*74a4d8c2SCharles.Forsyth 	hget();
180*74a4d8c2SCharles.Forsyth 	print("sym auxbf %d: rsav=%x lno=%d lns=%d fsz=%d nind=%d\n", i, rsav, lno, lns, fsz, nind);
181*74a4d8c2SCharles.Forsyth }
182*74a4d8c2SCharles.Forsyth 
183*74a4d8c2SCharles.Forsyth static void
readauxef(int i)184*74a4d8c2SCharles.Forsyth readauxef(int i)
185*74a4d8c2SCharles.Forsyth {
186*74a4d8c2SCharles.Forsyth 	int lno;
187*74a4d8c2SCharles.Forsyth 
188*74a4d8c2SCharles.Forsyth 	lget();
189*74a4d8c2SCharles.Forsyth 	lno = hget();
190*74a4d8c2SCharles.Forsyth 	lget();
191*74a4d8c2SCharles.Forsyth 	lget();
192*74a4d8c2SCharles.Forsyth 	lget();
193*74a4d8c2SCharles.Forsyth 	print("sym auxef %d: lno=%d\n", i, lno);
194*74a4d8c2SCharles.Forsyth }
195*74a4d8c2SCharles.Forsyth 
196*74a4d8c2SCharles.Forsyth static void
readauxother(int i)197*74a4d8c2SCharles.Forsyth readauxother(int i)
198*74a4d8c2SCharles.Forsyth {
199*74a4d8c2SCharles.Forsyth 	lget();
200*74a4d8c2SCharles.Forsyth 	lget();
201*74a4d8c2SCharles.Forsyth 	hget();
202*74a4d8c2SCharles.Forsyth 	lget();
203*74a4d8c2SCharles.Forsyth 	lget();
204*74a4d8c2SCharles.Forsyth 	print("sym auxother %d\n", i);
205*74a4d8c2SCharles.Forsyth }
206*74a4d8c2SCharles.Forsyth 
207*74a4d8c2SCharles.Forsyth static int
readsym(int i,char * st)208*74a4d8c2SCharles.Forsyth readsym(int i, char *st)
209*74a4d8c2SCharles.Forsyth {
210*74a4d8c2SCharles.Forsyth 	int v, s, t, c, aux;
211*74a4d8c2SCharles.Forsyth 	char *nm;
212*74a4d8c2SCharles.Forsyth 
213*74a4d8c2SCharles.Forsyth 	nm = sget(st);
214*74a4d8c2SCharles.Forsyth 	v = lget();
215*74a4d8c2SCharles.Forsyth 	s = hget();
216*74a4d8c2SCharles.Forsyth 	t = hget();
217*74a4d8c2SCharles.Forsyth 	c = cget();
218*74a4d8c2SCharles.Forsyth 	aux = cget();
219*74a4d8c2SCharles.Forsyth 	print("sym %d %s: val=%d sec=%d type=%d class=%d aux=%d\n", i, nm, v, s, t, c, aux);
220*74a4d8c2SCharles.Forsyth 	if(aux){
221*74a4d8c2SCharles.Forsyth 		i++;
222*74a4d8c2SCharles.Forsyth 		if(strcmp(nm, ".text") == 0 || strcmp(nm, ".data") == 0 || strcmp(nm, ".bss") == 0)
223*74a4d8c2SCharles.Forsyth 			readauxsect(i);
224*74a4d8c2SCharles.Forsyth 		else if(strcmp(nm, ".bf") == 0)
225*74a4d8c2SCharles.Forsyth 			readauxbf(i);
226*74a4d8c2SCharles.Forsyth 		else if(strcmp(nm, ".ef") == 0)
227*74a4d8c2SCharles.Forsyth 			readauxef(i);
228*74a4d8c2SCharles.Forsyth 		else if((t&0x30) == 0x20)	// will do
229*74a4d8c2SCharles.Forsyth 			readauxfun(i);
230*74a4d8c2SCharles.Forsyth 		else
231*74a4d8c2SCharles.Forsyth 			readauxother(i);
232*74a4d8c2SCharles.Forsyth 		return 1;
233*74a4d8c2SCharles.Forsyth 	}
234*74a4d8c2SCharles.Forsyth 	return 0;
235*74a4d8c2SCharles.Forsyth }
236*74a4d8c2SCharles.Forsyth 
237*74a4d8c2SCharles.Forsyth static char *
readstr(int n)238*74a4d8c2SCharles.Forsyth readstr(int n)
239*74a4d8c2SCharles.Forsyth {
240*74a4d8c2SCharles.Forsyth 	char *s = malloc(n);
241*74a4d8c2SCharles.Forsyth 
242*74a4d8c2SCharles.Forsyth 	if(read(fd, s+4, n-4) != n-4){
243*74a4d8c2SCharles.Forsyth 		fprint(2, "bad readstr\n");
244*74a4d8c2SCharles.Forsyth 		exits("sget");
245*74a4d8c2SCharles.Forsyth 	}
246*74a4d8c2SCharles.Forsyth 	return s;
247*74a4d8c2SCharles.Forsyth }
248*74a4d8c2SCharles.Forsyth 
249*74a4d8c2SCharles.Forsyth static void
readln(int i)250*74a4d8c2SCharles.Forsyth readln(int i)
251*74a4d8c2SCharles.Forsyth {
252*74a4d8c2SCharles.Forsyth 	int a, l;
253*74a4d8c2SCharles.Forsyth 
254*74a4d8c2SCharles.Forsyth 	a = lget();
255*74a4d8c2SCharles.Forsyth 	l = hget();
256*74a4d8c2SCharles.Forsyth 	if(l == 0)
257*74a4d8c2SCharles.Forsyth 		print("line %d: sym=%d\n", i, a);
258*74a4d8c2SCharles.Forsyth 	else
259*74a4d8c2SCharles.Forsyth 		print("line %d: addr=0x%x line=%d\n", i, a, l);
260*74a4d8c2SCharles.Forsyth }
261*74a4d8c2SCharles.Forsyth 
262*74a4d8c2SCharles.Forsyth static void
readf()263*74a4d8c2SCharles.Forsyth readf()
264*74a4d8c2SCharles.Forsyth {
265*74a4d8c2SCharles.Forsyth 	int i, opt, nsec, sym, nsym, stoff, strsz, linoff, nlin, lino, linn;
266*74a4d8c2SCharles.Forsyth 	char *st;
267*74a4d8c2SCharles.Forsyth 
268*74a4d8c2SCharles.Forsyth 	seek(fd, 0, 0);
269*74a4d8c2SCharles.Forsyth 	readhdr(&opt, &nsec, &sym, &nsym);
270*74a4d8c2SCharles.Forsyth 	if(opt)
271*74a4d8c2SCharles.Forsyth 		opthdr();
272*74a4d8c2SCharles.Forsyth 	stoff = sym+18*nsym;
273*74a4d8c2SCharles.Forsyth 	seek(fd, stoff, 0);
274*74a4d8c2SCharles.Forsyth 	strsz = lget();
275*74a4d8c2SCharles.Forsyth 	st = readstr(strsz);
276*74a4d8c2SCharles.Forsyth 	linoff = nlin = 0;
277*74a4d8c2SCharles.Forsyth 	seek(fd, 22+28, 0);
278*74a4d8c2SCharles.Forsyth 	for(i = 0; i < nsec; i++){
279*74a4d8c2SCharles.Forsyth 		section(i, st, &lino, &linn);
280*74a4d8c2SCharles.Forsyth 		if(linn != 0){
281*74a4d8c2SCharles.Forsyth 			if(nlin == 0){
282*74a4d8c2SCharles.Forsyth 				nlin = linn;
283*74a4d8c2SCharles.Forsyth 				linoff = lino;
284*74a4d8c2SCharles.Forsyth 			}
285*74a4d8c2SCharles.Forsyth 			else
286*74a4d8c2SCharles.Forsyth 				print("multiple line no. tables\n");
287*74a4d8c2SCharles.Forsyth 		}
288*74a4d8c2SCharles.Forsyth 	}
289*74a4d8c2SCharles.Forsyth 	seek(fd, sym, 0);
290*74a4d8c2SCharles.Forsyth 	for(i = 0; i < nsym; i++)
291*74a4d8c2SCharles.Forsyth 		i += readsym(i, st);
292*74a4d8c2SCharles.Forsyth 	print("strsz = %d\n", strsz);
293*74a4d8c2SCharles.Forsyth 	if(nlin != 0){
294*74a4d8c2SCharles.Forsyth 		seek(fd, linoff, 0);
295*74a4d8c2SCharles.Forsyth 		for(i = 0; i < nlin; i++)
296*74a4d8c2SCharles.Forsyth 			readln(i);
297*74a4d8c2SCharles.Forsyth 	}
298*74a4d8c2SCharles.Forsyth }
299