summaryrefslogtreecommitdiff
path: root/usr.sbin/dbsym/dbtest.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /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.c58
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);
+}