|
|
1.1 root 1: /* $Header: main.c,v 1.1 86/03/24 16:19:20 rcs Exp $ */
2: /* (C) Copyright 1985 Third Eye Software, Inc. - All Rights Reserved */
3:
4: #include "tes42.h"
5:
6: #include <sys/file.h>
7: #include <stab.h>
8:
9: /* indexes */
10: export int vissMac, vissMax;
11: export int vifd, vifdMac; /* vrgFd */
12: export int vipdMac, vipd; /* vrgPd */
13: export int viline, vilineMac = 1; /* vrgLine */
14: export int visym, visymMac = 1; /* vrgSym */
15: export int visymGlobal, visymGlMac, visymGlMax;
16: export int viauxMac, viaux; /* vrgAux */
17: export int vites42Max = tesF42Low; /* vrgTesF42 */
18:
19: /* flags */
20: export int vfBlockPending; /* true if got local */
21: export int vfVerbose; /* true if we want text out */
22: export int vfWarn; /* give certain warnings */
23:
24: export int vcLinesInProc; /* count of lines in cur proc */
25:
26: /* tables */
27: export char *vsbNewStr; /* new string table */
28: export int vadjust = 1; /* forces bigger tables */
29: export pAUXU vrgAux; /* aux table */
30: export pPDR vrgPd; /* proc table */
31: export pFDR vrgFd; /* file table */
32: export pLINER vrgLine; /* line no table */
33: export pSYMR vrgSym; /* symbol table */
34: export pSYMR vrgSymGlobal; /* global symbol table */
35: export pSYMR vrgSymBrac[100]; /* block stack for RBRAC's */
36: export int *vrgTesF42; /* map 42 no's to tes aux's */
37:
38: /* pointers */
39: export char *vsbType; /* points to cur type string */
40: export char *vsbMax; /* next avail. in vsbNewStr */
41: export pSYMR vsymProc; /* current proc symbol */
42: export pSYMR vsymBlock; /* block sym when pending */
43: export pSYMR vsymFile; /* current file */
44: export int vfdSym; /* channel of sym file */
45: export long vdot; /* last known adr in TEXT space */
46: export int vissTag; /* iss for tag type */
47:
48: export HDRR vahdr;
49:
50: /* kludges */
51: export int viauxProcPhony; /* something for phony procs */
52: export int viauxGlobalPhony; /* something for unknown globals */
53:
54: /* KLUDGE for SUN!! */
55: export pNLISTR vnlist;
56:
57:
58: /* M A I N */
59:
60: main(argc, argv)
61: int argc;
62: char *argv [];
63: {
64: char *sbFile = (char *) 0;
65:
66: argv++;
67: while (--argc) {
68:
69: if (*argv [0] == '-') {
70: switch (argv [0] [1]) {
71: case 's':
72: vadjust = atoi(argv[0]+2);
73: if ((vadjust <= 0) || (vadjust > 10)) {
74: printf("Bad scaling parameter: %d\n", vadjust);
75: exit(1);
76: } /* if */
77: argv++;
78: continue;
79: case 'v':
80: vfVerbose++;
81: argv++;
82: continue;
83: case 'w':
84: vfWarn++;
85: argv++;
86: continue;
87: default:
88: panic("illegal option");
89: } /* switch */
90: } else {
91: if (sbFile)
92: panic("only one filename allowed");
93: sbFile = argv [0];
94: argv++;
95: }
96: } /* while */
97:
98: if (sbFile == (char *) 0)
99: sbFile = "a.out";
100:
101: Sym42Init(sbFile);
102: AuxBtInit();
103: Map();
104: DumpAll(sbFile);
105: if (vfVerbose)
106: PrintAll();
107: exit(0);
108: } /* main */
109:
110:
111: /* M A P */
112:
113: export void Map()
114: {
115: SYMR asym;
116: register pSYMR sym;
117: register pSYMR sym1;
118: register int tq;
119: int fFirstGlobal;
120: int isymType, sc, st, iss;
121: register char *sbName;
122: int cbName;
123: pFDR fd;
124: pPDR pd;
125: static TIR ati;
126:
127: fFirstGlobal = true;
128: vnlist = (pNLISTR) malloc(vcsym * cbNLISTR);
129: if (vnlist == nlistNil) {
130: perror("allocation for symbol table");
131: exit(1);
132: } /* if */
133:
134: if (read(vfdSym, vnlist, cbNLISTR * vcsym) != cbNLISTR * vcsym) {
135: perror("symbol read");
136: exit(1);
137: } /* if */
138:
139: /* build something for phony procedures to point at */
140: viauxProcPhony = AddAux(isymNil);
141: ati.tq0 = tqProc;
142: ati.bt = btInt;
143: AddAux(ati);
144: viauxGlobalPhony = AddAux(AuxFBType(btInt));
145:
146: DoFile(nlistNil, "temp");
147: while (vcsym--) {
148: sbName = vsbStr + vnlist->n_un.n_strx;
149:
150: /* the following code to process loader symbols depends
151: * on their occuring after symbol table symbols in
152: * the bsd42 symbol table.
153: */
154: sc = scNil;
155: st = stNil;
156:
157: switch (vnlist->n_type) {
158:
159: case N_TEXT:
160: cbName = strlen(sbName);
161: if (sbName[cbName - 1] == 'o' && sbName[cbName - 2] == '.') {
162: DoFile(vnlist, sbName);
163: vnlist++;
164: continue;
165: } else if (sbName[0] == '-'
166: && sbName[1] == 'l'
167: && sbName[2] == 'g') {
168: DoFile(vnlist, sbName);
169: vnlist++;
170: continue;
171: } else {
172: sc = scText;
173: st = stLabel;
174: goto llocal;
175: } /* if */
176: case N_DATA:
177: sc = scData;
178: st = stGlobal;
179: goto llocal;
180: case N_ABS:
181: break; /* for now we throw them away */
182: /* sc = scAbs;
183: * goto llocal;
184: */
185: case N_BSS:
186: sc = scBss;
187: st = stGlobal;
188: llocal:
189: if (*sbName == '_') sbName++;
190: iss = IssFSbInsert(sbName);
191: if (!ExistingFdSymFIss(iss)) {
192: sym = SymFInsert();
193: sym->sc = sc;
194: sym->st = st;
195: sym->value = vnlist->n_value;
196: sym->iss = iss;
197: sym->index = viauxGlobalPhony;
198: } /* if */
199: vnlist++;
200: continue;
201:
202: case N_EXT+N_TEXT:
203: if (vsymProc) {
204: /* there was a previous proc, so end it */
205: sym = SymFInsert();
206: sym->st = stEnd;
207: sym->sc = scText;
208: sym->index = IsymFSym(vsymProc);
209: sym->value = vdot; /* last know text adr */
210: ChangeAux(vsymProc->index, visym);
211: vsymProc = symNil;
212: } /* if */
213:
214: asym.sc = scText;
215: if (*sbName == '_') sbName++;
216: asym.iss = IssFSbInsert(sbName);
217: if ((sym = ExistingSymFSbProc(asym.iss)) != symNil) {
218: if (!sym->sc)
219: sym->sc = asym.sc;
220: } else {
221: sym = SymFInsert();
222: sym->sc = asym.sc;
223: sym->st = stProc;
224: sym->index = viauxProcPhony;
225: sym->iss = asym.iss;
226: ProcInsert(IsymFSym(sym), vnlist->n_value, 0);
227: } /* if */
228: sym->value = vnlist->n_value;
229: vnlist++;
230: continue;
231:
232: case N_EXT+N_DATA:
233: asym.sc = scData;
234: asym.st = stGlobal;
235: goto ldoexternal;
236: case N_EXT+N_ABS:
237: asym.sc = scAbs;
238: goto ldoexternal;
239: case N_EXT+N_BSS:
240: asym.sc = scBss;
241: asym.st = stGlobal;
242: ldoexternal:
243: if (*sbName == '_')
244: sbName++;
245: asym.iss = IssFSbInsert(sbName);
246: if ((sym = ExistingSymFGlobal(&asym)) != symNil) {
247: if (!sym->sc)
248: sym->sc = asym.sc;
249: } else {
250: if (fFirstGlobal) {
251: EndFile(vdot);
252: fFirstGlobal = false;
253: } /* if */
254: sym = SymFGlobal();
255: sym->sc = asym.sc;
256: sym->iss = asym.iss;
257: sym->index = viauxGlobalPhony;
258: } /* if */
259: sym->value = vnlist->n_value;
260: sym->st = asym.st;
261: vnlist++;
262: continue;
263:
264: case N_SLINE:
265: DoLine(vnlist);
266: vnlist++;
267: continue;
268:
269: case N_SOL:
270: vnlist++;
271: continue;
272:
273: case N_SO:
274: DoFile(vnlist, sbName);
275: vnlist++;
276: continue;
277:
278: case N_LBRAC:
279: DoLBrac(vnlist);
280: vnlist++;
281: continue;
282:
283: case N_RBRAC:
284: DoRBrac(vnlist);
285: vnlist++;
286: continue;
287:
288: default:
289: DoSym(vnlist, sbName);
290:
291: } /* switch */
292:
293: vnlist++;
294: } /*while */
295:
296: /* fix the damn fd's, ya happy GFW? */
297: vrgFd[0].ipd = -1;
298: vrgFd[0].iline = 0;
299: for (fd = vrgFd+1, pd = vrgPd; fd < vrgFd+vifdMac; fd++) {
300: while ((pd < vrgPd+vipdMac) && (fd->adr > pd->adr))
301: pd++;
302: fd->ipd = pd - vrgPd;
303: if (vrgSym[pd->isym].index == viauxProcPhony)
304: pd->iline = 0;
305: fd->iline = pd->iline; /* is this always correct? */
306: } /* for */
307: } /* Map */
308:
309:
310: /* D U M P A L L */
311:
312: export void DumpAll(sbFile)
313: char *sbFile;
314: {
315: char sbTes[200];
316: int cGlobals, file;
317: long cbOffset;
318: extern struct exec vhead;
319:
320: strcpy(sbTes, sbFile);
321: strcat(sbTes, ".cdb");
322:
323: vahdr.magic = vhead.a_magic;
324: vahdr.vstamp = 0;
325: vahdr.ijokeDay = ijokeNil;
326: vahdr.cbText = vhead.a_text;
327: vahdr.cbData = vhead.a_data;
328: vahdr.cbBss = vhead.a_bss;
329: vahdr.entrypoint = vhead.a_entry;
330:
331:
332: if ((file = open(sbTes, O_WRONLY+O_CREAT, 0666)) <= -1) {
333: perror("can't open output file");
334: exit(1);
335: } /* if */
336:
337: #define WRITE_IT(fd,buf,size,count,msg) \
338: if (write(fd, buf, (size) * (count)) != (size) * (count)) {\
339: perror(msg);\
340: exit(1);\
341: } else {\
342: cbOffset += (size) * (count);\
343: } /* if */
344:
345: cbOffset = 0;
346: WRITE_IT(file, &vahdr, cbHDRR, 1, "header")
347:
348: vahdr.ipdMax = vipdMac;
349: vahdr.cbPdOffset = cbOffset;
350: WRITE_IT(file, vrgPd, cbPDR, vipdMac, "procedures")
351:
352: vahdr.ifdMax = vifdMac;
353: vahdr.cbFdOffset = cbOffset;
354: WRITE_IT(file, vrgFd, cbFDR, vifdMac, "files")
355:
356: vahdr.ilineMax = vilineMac;
357: vahdr.cbLineOffset = cbOffset;
358: WRITE_IT(file, vrgLine, cbLINER, vilineMac, "lines")
359:
360: vahdr.iauxMax = viauxMac;
361: vahdr.cbAuxOffset = cbOffset;
362: WRITE_IT(file, vrgAux, cbAUXU, viauxMac, "auxes")
363:
364: vahdr.isymGl = visymMac;
365: vahdr.isymGlMax = vahdr.isymMax = visymMac + visymGlMac;
366: vahdr.cbSymOffset = cbOffset;
367: WRITE_IT(file, vrgSym, cbSYMR, visymMac, "symbols")
368: WRITE_IT(file, vrgSymGlobal, cbSYMR, visymGlMac, "globals")
369:
370: vahdr.issMax = vissMac;
371: vahdr.cbSsOffset = cbOffset;
372: WRITE_IT(file, vsbNewStr, vissMac, 1, "strings");
373:
374: lseek(file, 0L, 0);
375: WRITE_IT(file, &vahdr, cbHDRR, 1, "header")
376: } /* DumpAll */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.