|
|
1.1 root 1: /*
2: * set up the symbol table
3: * very cheap hack version for cray:
4: * read the loader map
5: */
6:
7: #include "defs.h"
8: #include "sym.h"
9: #include <stdio.h>
10: #include "machine.h"
11:
12: #define NMFMT "%s %lo%c" /* name value (junk) */
13:
14: #define NSYMS 20
15:
16: static lcopy();
17:
18: /*
19: * `fn' is the name of the a.out file.
20: * if it was a valid a.out, look for a map in `fn'.map
21: * else see if fn itself is a map
22: */
23:
24: hksyminit(fn, isexec)
25: char *fn;
26: int isexec;
27: {
28: FILE *fp;
29: register struct sym *p;
30: struct sym *syms;
31: char buf[ARB];
32: long val;
33: char flag;
34: char name[ARB];
35: int inmap = 0;
36: char *malloc();
37:
38: symtab = NULL;
39: strcpy(name, fn);
40: if (isexec)
41: strcat(name, ".map");
42: if ((fp = fopen(name, "r")) == NULL)
43: return;
44: if (fgets(buf, ARB, fp) == NULL
45: || (buf[0] != '1' || buf[2] != ' ')) {
46: fclose(fp);
47: return; /* probably not a loader map */
48: }
49: syms = NULL;
50: while (fgets(buf, ARB, fp)) {
51: if (inmap == 0) {
52: if (maphdr(buf) == 0)
53: continue;
54: inmap++;
55: }
56: if (sscanf(buf, NMFMT, name, &val, &flag) != 3)
57: continue;
58: if (!isalpha(name[0]))
59: continue;
60: if (syms == NULL || p >= syms + NSYMS) {
61: if ((syms = (struct sym *)malloc(NSYMS * sizeof(struct sym))) == NULL) {
62: printf("out of mem for syms");
63: break;
64: }
65: p = syms;
66: }
67: if ((p->y_name = malloc(strlen(name) + 1)) == NULL) {
68: printf("out of mem for syms");
69: break;
70: }
71: lcopy(p->y_name, name);
72: p->y_value = watoba(val);
73: if (flag == ' ')
74: p->y_type = S_DATA;
75: else
76: p->y_type = S_TEXT; /* parcel addr */
77: p->y_next = symtab;
78: symtab = p;
79: p++;
80: }
81: fclose(fp);
82: }
83:
84: /*
85: * look for the beginning of the interesting part
86: * this is just to cut down on specious syms
87: */
88:
89: maphdr(s)
90: register char *s;
91: {
92:
93: while (*s == ' ')
94: s++;
95: return (strncmp(s, "ENTRY POINT CROSS-", 18) == 0);
96: }
97:
98: static
99: lcopy(s, t)
100: register char *s, *t;
101: {
102:
103: while (*t) {
104: if (*t == '$') {
105: *s++ = '_';
106: t++;
107: }
108: else
109: *s++ = *t++;
110: }
111: *s = 0;
112: }
113:
114: /*
115: * compare sym entry name with one the user typed
116: */
117: eqsym(sp, n)
118: struct sym *sp;
119: char *n;
120: {
121:
122: return (strncmp(sp->y_name, n, 8) == 0);
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.