|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie the
24: * rights to redistribute these changes.
25: */
26: /*
27: * HISTORY
28: * $Log: db_aout.c,v $
29: * Revision 1.1 1992/03/25 21:44:55 pace
30: * Initial revision
31: *
32: * Revision 2.3 91/02/05 17:05:55 mrt
33: * Changed to new Mach copyright
34: * [91/01/31 16:16:44 mrt]
35: *
36: * Revision 2.2 90/08/27 21:48:35 dbg
37: * Created.
38: * [90/08/17 dbg]
39: *
40: */
41: /*
42: * Author: David B. Golub, Carnegie Mellon University
43: * Date: 7/90
44: */
45: /*
46: * Symbol table routines for a.out format files.
47: */
48:
49: #include "param.h"
50: #include "proc.h"
51: #include <machine/db_machdep.h> /* data types */
52: #include <ddb/db_sym.h>
53:
54: #ifndef DB_NO_AOUT
55:
56: #define _AOUT_INCLUDE_
57: #include "nlist.h"
58:
59: /*
60: * An a.out symbol table as loaded into the kernel debugger:
61: *
62: * symtab -> size of symbol entries, in bytes
63: * sp -> first symbol entry
64: * ...
65: * ep -> last symbol entry + 1
66: * strtab == start of string table
67: * size of string table in bytes,
68: * including this word
69: * -> strings
70: */
71:
72: /*
73: * Find pointers to the start and end of the symbol entries,
74: * given a pointer to the start of the symbol table.
75: */
76: #define db_get_aout_symtab(symtab, sp, ep) \
77: (sp = (struct nlist *)((symtab) + 1), \
78: ep = (struct nlist *)((char *)sp + *(symtab)))
79:
80: #define SYMTAB_SPACE 63000
81: int db_symtabsize = SYMTAB_SPACE;
82: char db_symtab[SYMTAB_SPACE] = { 1 };
83:
84: X_db_sym_init(symtab, esymtab, name)
85: int * symtab; /* pointer to start of symbol table */
86: char * esymtab; /* pointer to end of string table,
87: for checking - rounded up to integer
88: boundary */
89: char * name;
90: {
91: register struct nlist *sym_start, *sym_end;
92: register struct nlist *sp;
93: register char * strtab;
94: register int strlen;
95:
96: if (*symtab < 4) {
97: printf ("DDB: no symbols\n");
98: return;
99: }
100:
101: db_get_aout_symtab(symtab, sym_start, sym_end);
102:
103: strtab = (char *)sym_end;
104: strlen = *(int *)strtab;
105:
106: #if 0
107: if (strtab + ((strlen + sizeof(int) - 1) & ~(sizeof(int)-1))
108: != esymtab)
109: {
110: db_printf("[ %s symbol table not valid ]\n", name);
111: return;
112: }
113:
114: db_printf("[ preserving %#x bytes of %s symbol table ]\n",
115: esymtab - (char *)symtab, name);
116: #endif
117:
118: for (sp = sym_start; sp < sym_end; sp++) {
119: register int strx;
120: strx = sp->n_un.n_strx;
121: if (strx != 0) {
122: if (strx > strlen) {
123: db_printf("Bad string table index (%#x)\n", strx);
124: sp->n_un.n_name = 0;
125: continue;
126: }
127: sp->n_un.n_name = strtab + strx;
128: }
129: }
130:
131: db_add_symbol_table(sym_start, sym_end, name, (char *)symtab);
132: }
133:
134: db_sym_t
135: X_db_lookup(stab, symstr)
136: db_symtab_t *stab;
137: char * symstr;
138: {
139: register struct nlist *sp, *ep;
140:
141: sp = (struct nlist *)stab->start;
142: ep = (struct nlist *)stab->end;
143:
144: for (; sp < ep; sp++) {
145: if (sp->n_un.n_name == 0)
146: continue;
147: if ((sp->n_type & N_STAB) == 0 &&
148: sp->n_un.n_name != 0 &&
149: db_eqname(sp->n_un.n_name, symstr, '_'))
150: {
151: return ((db_sym_t)sp);
152: }
153: }
154: return ((db_sym_t)0);
155: }
156:
157: db_sym_t
158: X_db_search_symbol(symtab, off, strategy, diffp)
159: db_symtab_t * symtab;
160: register
161: db_addr_t off;
162: db_strategy_t strategy;
163: db_expr_t *diffp; /* in/out */
164: {
165: register unsigned int diff = *diffp;
166: register struct nlist *symp = 0;
167: register struct nlist *sp, *ep;
168:
169: sp = (struct nlist *)symtab->start;
170: ep = (struct nlist *)symtab->end;
171:
172: for (; sp < ep; sp++) {
173: if (sp->n_un.n_name == 0)
174: continue;
175: if ((sp->n_type & N_STAB) != 0)
176: continue;
177: if (off >= sp->n_value) {
178: if (off - sp->n_value < diff) {
179: diff = off - sp->n_value;
180: symp = sp;
181: if (diff == 0)
182: break;
183: }
184: else if (off - sp->n_value == diff) {
185: if (symp == 0)
186: symp = sp;
187: else if ((symp->n_type & N_EXT) == 0 &&
188: (sp->n_type & N_EXT) != 0)
189: symp = sp; /* pick the external symbol */
190: }
191: }
192: }
193: if (symp == 0) {
194: *diffp = off;
195: }
196: else {
197: *diffp = diff;
198: }
199: return ((db_sym_t)symp);
200: }
201:
202: /*
203: * Return the name and value for a symbol.
204: */
205: void
206: X_db_symbol_values(sym, namep, valuep)
207: db_sym_t sym;
208: char **namep;
209: db_expr_t *valuep;
210: {
211: register struct nlist *sp;
212:
213: sp = (struct nlist *)sym;
214: if (namep)
215: *namep = sp->n_un.n_name;
216: if (valuep)
217: *valuep = sp->n_value;
218: }
219:
220: boolean_t
221: X_db_line_at_pc()
222: {
223: return (FALSE);
224: }
225:
226: /*
227: * Initialization routine for a.out files.
228: */
229: kdb_init()
230: {
231: #if 0
232: extern char *esym;
233: extern int end;
234:
235: if (esym > (char *)&end) {
236: X_db_sym_init((int *)&end, esym, "mach");
237: }
238: #endif
239:
240: X_db_sym_init (db_symtab, 0, "mach");
241: }
242:
243: #if 0
244: /*
245: * Read symbol table from file.
246: * (should be somewhere else)
247: */
248: #include <boot_ufs/file_io.h>
249: #include <vm/vm_kern.h>
250:
251: read_symtab_from_file(fp, symtab_name)
252: struct file *fp;
253: char * symtab_name;
254: {
255: vm_size_t resid;
256: kern_return_t result;
257: vm_offset_t symoff;
258: vm_size_t symsize;
259: vm_offset_t stroff;
260: vm_size_t strsize;
261: vm_size_t table_size;
262: vm_offset_t symtab;
263:
264: if (!get_symtab(fp, &symoff, &symsize)) {
265: boot_printf("[ error %d reading %s file header ]\n",
266: result, symtab_name);
267: return;
268: }
269:
270: stroff = symoff + symsize;
271: result = read_file(fp, (vm_offset_t)stroff,
272: (vm_offset_t)&strsize, sizeof(strsize), &resid);
273: if (result || resid) {
274: boot_printf("[ no valid symbol table present for %s ]\n",
275: symtab_name);
276: return;
277: }
278:
279: table_size = sizeof(int) + symsize + strsize;
280: table_size = (table_size + sizeof(int)-1) & ~(sizeof(int)-1);
281:
282: symtab = kmem_alloc_wired(kernel_map, table_size);
283:
284: *(int *)symtab = symsize;
285:
286: result = read_file(fp, symoff,
287: symtab + sizeof(int), symsize, &resid);
288: if (result || resid) {
289: boot_printf("[ error %d reading %s symbol table ]\n",
290: result, symtab_name);
291: return;
292: }
293:
294: result = read_file(fp, stroff,
295: symtab + sizeof(int) + symsize, strsize, &resid);
296: if (result || resid) {
297: boot_printf("[ error %d reading %s string table ]\n",
298: result, symtab_name);
299: return;
300: }
301:
302: X_db_sym_init((int *)symtab,
303: (char *)(symtab + table_size),
304: symtab_name);
305:
306: }
307: #endif
308:
309: #endif /* DB_NO_AOUT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.