|
|
1.1 root 1: /*
2: * libc/gen/coffnlist.c
3: * Get entries from coff nlist.
4: */
5:
6: #include <stdio.h>
7: #include <coff.h>
8:
9: /*
10: * Symbol name.
11: */
12: static char *
13: symName(sym, str_tab, work)
14: SYMENT *sym;
15: char *str_tab, *work;
16: {
17: if (!sym->n_zeroes)
18: return (str_tab + sym->n_offset - 4);
19:
20: /* make sure it's zero terminated */
21: memcpy(work, sym->n_name, SYMNMLEN);
22: work[SYMNMLEN] = '\0';
23: return (work);
24: }
25:
26: coffnlist(fn, nlp, names, count)
27: char *fn; /* file name */
28: SYMENT *nlp; /* names to look up */
29: char *names; /* long names */
30: int count; /* size of passed table */
31: {
32: FILEHDR head;
33: FILE *fp;
34: char *str_tab;
35: long str_length;
36: int aux, i;
37:
38: if (NULL == (fp = fopen(fn, "rb")))
39: return(0);
40:
41: if (1 != fread(&head, sizeof(head), 1, fp) ||
42: head.f_magic != C_386_MAGIC) {
43: fclose (fp);
44: return (0);
45: }
46:
47: fseek(fp, head.f_symptr + (SYMESZ * head.f_nsyms), 0);
48: if (1 != fread(&str_length, sizeof(str_length), 1, fp))
49: str_length = 0;
50: if (str_length) {
51: unsigned len;
52:
53: len = str_length -= 4;
54: if (len != str_length || NULL == (str_tab = malloc(len))) {
55: fclose (fp);
56: return (0);
57: }
58:
59: if (1 != fread(str_tab, len, 1, fp)) {
60: free(str_tab);
61: fclose (fp);
62: return (0);
63: }
64: }
65:
66: fseek(fp, head.f_symptr, 0);
67: for (i = aux = 0; i < head.f_nsyms; i++) {
68: SYMENT sym; /* symbol read in */
69: int taux, j;
70:
71: if (1 != fread(&sym, SYMESZ, 1, fp)) {
72: free(str_tab);
73: fclose (fp);
74: return (0);
75: }
76: if (aux) {
77: aux--;
78: continue;
79: }
80: aux = sym.n_numaux;
81: for (j = taux = 0; j < count; j++) {
82: static char n1[SYMNMLEN + 1], n2[SYMNMLEN + 1];
83: register SYMENT *np;
84:
85: if (taux) {
86: taux--;
87: continue;
88: }
89: np = nlp + j;
90: taux = np->n_numaux;
91: if (np->n_type != 0xFFFF ||
92: strcmp(symName(np, names, n1),
93: symName(&sym, str_tab, n2)))
94: continue;
95: np->n_value = sym.n_value;
96: np->n_scnum = sym.n_scnum;
97: np->n_type = sym.n_type;
98: np->n_sclass = sym.n_sclass;
99: }
100: }
101: free(str_tab);
102: fclose (fp);
103: return (1);
104: }
105:
106: #ifdef TEST
107: main()
108: {
109: static SYMENT sym[3];
110: static char ptr[] = "a_very_long_name";
111:
112: strcpy(sym[0]._n._n_name, "x");
113: sym[0].n_type = -1;
114:
115: strcpy(sym[1]._n._n_name, "y");
116: sym[1].n_type = -1;
117:
118: sym[2]._n._n_n._n_zeroes = 0;
119: sym[2]._n._n_n._n_offset = sizeof(long);
120: sym[2].n_type = -1;
121:
122: coffnlist("tx.o", sym, ptr, 3);
123: }
124: #endif
125:
126: /* end of coffnlist.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.