|
|
1.1 root 1: static char sccsid[] = "@(#)sym.c 4.3 4/27/87";
2: /*
3: * adb - symbol table routines
4: */
5: #include "defs.h"
6: #include <stab.h>
7:
8: /*
9: * Lookup a symbol by name.
10: */
11: struct nlist *
12: lookup(symstr)
13: char *symstr;
14: {
15: register struct nlist *sp;
16:
17: cursym = 0;
18: if (symtab)
19: for (sp = symtab; sp < esymtab; sp++)
20: /* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */
21: if ((sp->n_type&N_STAB)==0 && eqsym(sp->n_un.n_name, symstr, '_'))
22: return(cursym = sp);
23: return (0);
24: }
25:
26: /*
27: * Find the closest symbol to val, and return
28: * the difference between val and the symbol found.
29: * Leave a pointer to the symbol found as cursym.
30: */
31: findsym(val, type)
32: long val;
33: int type;
34: {
35: long diff;
36: register struct nlist *sp;
37:
38: cursym = 0;
39: diff = MAXINT;
40: if (type == NSYM || symtab == 0)
41: return (diff);
42: for (sp = symtab; sp < esymtab; sp++) {
43: if (sp->n_type & N_STAB || !(sp->n_type & N_EXT)
44: || sp->n_type == (N_FN|N_EXT))
45: continue;
46: if (val - sp->n_value < diff && val >= sp->n_value) {
47: diff = val - sp->n_value;
48: cursym = sp;
49: if (diff == 0)
50: break;
51: }
52: }
53: return (diff);
54: }
55:
56: /*
57: * Advance cursym to the next local variable.
58: * Leave its value in localval as a side effect.
59: * Return 0 at end of file.
60: */
61: localsym(cframe, cargp)
62: ADDR cframe, cargp;
63: {
64: register int type;
65: register struct nlist *sp;
66:
67: if (cursym)
68: for (sp = cursym; ++sp < esymtab; ) {
69: if (sp->n_un.n_name[0] =='_' || sp->n_type == N_FN)
70: return (0);
71: type = sp->n_type;
72: switch (sp->n_type) {
73:
74: case N_TEXT:
75: case N_TEXT|N_EXT:
76: case N_DATA:
77: case N_DATA|N_EXT:
78: case N_BSS:
79: case N_BSS|N_EXT:
80: localval = sp->n_value;
81: cursym = sp;
82: return (1);
83:
84: case N_LSYM:
85: localval = cframe - sp->n_value;
86: cursym = sp;
87: return (1);
88:
89: case N_PSYM:
90: /* code below works since n_value > 0 */
91: case N_ABS:
92: if (sp->n_value < 0)
93: localval = cframe + sp->n_value;
94: else
95: localval = cargp + sp->n_value;
96: cursym = sp;
97: return (1);
98: }
99: }
100: cursym = 0;
101: return (0);
102: }
103:
104: /*
105: * Print value v and then the string s.
106: * If v is not zero, then we look for a nearby symbol
107: * and print name+offset if we find a symbol for which
108: * offset is small enough.
109: *
110: * For values which are just into kernel address space
111: * that they match exactly or that they be more than maxoff
112: * bytes into kernel space.
113: */
114: psymoff(v, type, s)
115: long v;
116: int type;
117: char *s;
118: {
119: long w;
120:
121: if (v)
122: w = findsym(v, type);
123: if (v==0 || w >= maxoff || (INKERNEL(v) && KVTOPH(v) < maxoff && w))
124: printf(LPRMODE, v);
125: else {
126: printf("%s", cursym->n_un.n_name);
127: if (w)
128: printf(OFFMODE, w);
129: }
130: printf(s);
131: }
132:
133: /*
134: * Print value v symbolically if it has a reasonable
135: * interpretation as name+offset. If not, print nothing.
136: * Used in printing out registers $r.
137: */
138: valpr(v, idsp)
139: long v;
140: {
141: off_t d;
142:
143: d = findsym(v, idsp);
144: if (d >= maxoff)
145: return;
146: printf("%s", cursym->n_un.n_name);
147: if (d)
148: printf(OFFMODE, d);
149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.