summaryrefslogtreecommitdiff
path: root/usr.sbin/dbsym/dbtest.c
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);
}