diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /usr.sbin/dbsym/dbtest.c |
initial import of NetBSD tree
Diffstat (limited to 'usr.sbin/dbsym/dbtest.c')
-rw-r--r-- | usr.sbin/dbsym/dbtest.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/usr.sbin/dbsym/dbtest.c b/usr.sbin/dbsym/dbtest.c new file mode 100644 index 00000000000..3db6c667c77 --- /dev/null +++ b/usr.sbin/dbsym/dbtest.c @@ -0,0 +1,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); +} |