blob: 3db6c667c77efb451ea9a94c667b3d1d2b8081a4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#include <stdio.h>
#include <a.out.h>
#define SYMTAB_SPACE 0x8000
int db_symtabsize = SYMTAB_SPACE;
char db_symtab[SYMTAB_SPACE] = { 0,0,0,0,1 };
/*
* The actual format of the above is:
* int symtab_length = NSYMS;
* struct nlist[NSYMS];
* int strtab_length;
* char strtab[];
*/
/* Print out our symbol table. */
main()
{
struct nlist *nl;
int symtab_len, strtab_len;
char *strtab;
char *p;
int *ip;
int st, sc, x;
/* symbol table */
ip = (int*) db_symtab;
symtab_len = *ip++;
if (symtab_len < 4) {
printf("no symbol table\n");
exit(1);
}
nl = (struct nlist *) ip;
/* string table pointer and length */
ip = (int*) ((char*)ip + symtab_len);
strtab = (char*)ip;
strtab_len = *ip;
if (strtab_len > (SYMTAB_SPACE - symtab_len))
strtab_len = (SYMTAB_SPACE - symtab_len);
/* print symbol table */
while ((x=nl->n_un.n_strx) != 0) {
if (x < 0 || x >= strtab_len) p = "?";
else p = strtab + x;
st = nl->n_type & 0x1F;
sc = "uatdbxxxxcxxxxxxx"[st>1];
if (st & 1) sc &= ~0x20; /* to upper */
printf("%08X %c %s\n", nl->n_value, sc, p);
nl++;
if ((char*)nl >= strtab) {
printf("symbol table missing null terminator\n");
break;
}
}
exit(0);
}
|