|
|
1.1 root 1: /*
2: * init the symbol table
3: */
4:
5: #include "defs.h"
6: #include "sym.h"
7: #include "a.out.h"
8: #include <sys/types.h>
9:
10: #define NSYMS 300
11: #define BIGBUF (4*4096)
12:
13: extern struct sym *symtab;
14: long A6base;
15:
16: syminit(h)
17: struct exec *h;
18: {
19: register Sym *q;
20: register n, m;
21: Sym space[BIGBUF/sizeof(Sym)];
22: struct sym *sbuf;
23: register struct sym *cur;
24: struct sym *curgbl;
25: register int type, ltype;
26: off_t off;
27: char *malloc();
28: char *savename();
29:
30: symtab = NULL;
31: if (h->a_syms == 0)
32: return; /* stripped */
33: off = swal(h->a_text) + swal(h->a_data);
34: #if NOTDEF
35: if ((swal(h->a_flag) & 01) == 0)
36: off += off; /* space for reloc data */
37: #endif
38: lseek(fsym, off + sizeof(*h), 0);
39: curgbl = sbuf = cur = NULL;
40: for (n = swal(h->a_syms); n > 0 ;) {
41: m = read(fsym, (char *)space, min(n, sizeof(space)));
42: if (m <= 0)
43: break;
44: n -= m;
45: for (q = space; m > 0; q++, m-= sizeof(space[0])) {
46: switch (q->type) {
47: case 'T':
48: case 't':
49: type = S_TEXT;
50: break;
51:
52: case 'D':
53: case 'd':
54: case 'B':
55: case 'b':
56: type = S_DATA;
57: break;
58:
59: default:
60: continue;
61: }
62: if (sbuf == NULL || ++cur >= sbuf + NSYMS) {
63: if ((sbuf = (struct sym *)malloc(sizeof(struct sym) * NSYMS)) == NULL) {
64: printf("out of mem for syms\n");
65: return;
66: }
67: cur = sbuf;
68: }
69: cur->y_type = type;
70: cur->y_ltype = ltype;
71: cur->y_value = swal(q->value);
72: cur->y_name = savename(q->name, sizeof(q->name));
73: if (strcmp(cur->y_name, "a6base") == 0)
74: A6base = swal(q->value);
75: cur->y_locals = NULL;
76: if (cur->y_type == S_TEXT && q->name[0] == '~') {
77: cur->y_next = curgbl;
78: curgbl = cur;
79: }
80: else if (cur->y_type == S_STAB) {
81: if (curgbl == NULL)
82: continue;
83: cur->y_next = curgbl->y_locals;
84: curgbl->y_locals = cur;
85: }
86: else {
87: cur->y_next = symtab;
88: symtab = cur;
89: }
90: }
91: }
92: for (; curgbl; curgbl = curgbl->y_next) {
93: if (curgbl->y_locals == NULL)
94: continue;
95: for (cur = symtab; cur; cur = cur->y_next) {
96: if (cur->y_type != S_TEXT)
97: continue;
98: if (cur->y_value == curgbl->y_value) {
99: cur->y_locals = curgbl->y_locals;
100: break;
101: }
102: }
103: }
104: }
105:
106: static char *
107: savename(n, sz)
108: char *n;
109: register int sz;
110: {
111: char *p;
112: char *malloc();
113:
114: if ((p = malloc(sz+1)) == NULL)
115: return ("");
116: strncpy(p, n, sz);
117: p[sz] = 0;
118: return (p);
119: }
120:
121: eqsym(sp, n)
122: struct sym *sp;
123: char *n;
124: {
125:
126: return (strncmp(sp->y_name, n, NNAME) == 0);
127: }
128:
129: min(a, b)
130: {
131: if (a < b)
132: return (a);
133: else
134: return (b);
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.