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