aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/dbsym
diff options
context:
space:
mode:
authorRodney W. Grimes <rgrimes@FreeBSD.org>1993-06-12 14:49:13 +0000
committerRodney W. Grimes <rgrimes@FreeBSD.org>1993-06-12 14:49:13 +0000
commit9002c02abc587664acb357c6879d8ca08664dd0b (patch)
tree515fc124b039c993c5762b23524842c4aebcaa06 /usr.sbin/dbsym
downloadsrc-9002c02abc587664acb357c6879d8ca08664dd0b.tar.gz
src-9002c02abc587664acb357c6879d8ca08664dd0b.zip
Initial import, 0.1 + pk 0.2.4-B1
Notes
Notes: svn path=/cvs2svn/branches/tcpdump/; revision=2
Diffstat (limited to 'usr.sbin/dbsym')
-rw-r--r--usr.sbin/dbsym/Makefile4
-rw-r--r--usr.sbin/dbsym/dbsym.c192
2 files changed, 196 insertions, 0 deletions
diff --git a/usr.sbin/dbsym/Makefile b/usr.sbin/dbsym/Makefile
new file mode 100644
index 000000000000..95ab527a9dd2
--- /dev/null
+++ b/usr.sbin/dbsym/Makefile
@@ -0,0 +1,4 @@
+PROG= dbsym
+NOMAN= noman
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/dbsym/dbsym.c b/usr.sbin/dbsym/dbsym.c
new file mode 100644
index 000000000000..46514b4c1e32
--- /dev/null
+++ b/usr.sbin/dbsym/dbsym.c
@@ -0,0 +1,192 @@
+/* Written by Pace Willisson (pace@blitz.com)
+ * and placed in the public domain.
+ */
+#include <stdio.h>
+#include <a.out.h>
+
+char *malloc ();
+
+#define FILE_OFFSET(vadr) (((vadr) & ~0xff000000)-N_DATADDR(hdr)+N_DATOFF(hdr))
+
+struct nlist *old_syms;
+int num_old_syms;
+char *old_strtab;
+int old_strtab_size;
+
+struct nlist *new_syms;
+int num_new_syms;
+int new_syms_bytes;
+char *new_strtab;
+int new_strtab_size;
+
+int db_symtabsize_adr;
+int db_symtab_adr;
+
+int avail;
+
+
+usage ()
+{
+ fprintf (stderr, "usage: dbsym file\n");
+ exit (1);
+}
+
+struct exec hdr;
+
+main (argc, argv)
+char **argv;
+{
+ FILE *f;
+ char *name;
+ extern int optind;
+ int c, i;
+ int need;
+ char *buf, *p;
+ struct nlist *nsp, *sp;
+ int len;
+
+
+ while ((c = getopt (argc, argv, "")) != EOF) {
+ switch (c) {
+ default:
+ usage ();
+ }
+ }
+
+ if (optind >= argc)
+ usage ();
+
+ name = argv[optind++];
+
+ if (optind != argc)
+ usage ();
+
+ if ((f = fopen (name, "r+")) == NULL) {
+ fprintf (stderr, "can't open %s\n", name);
+ exit (1);
+ }
+
+ if (fread ((char *)&hdr, sizeof hdr, 1, f) != 1) {
+ fprintf (stderr, "can't read header\n");
+ exit (1);
+ }
+
+ if (N_BADMAG (hdr)) {
+ fprintf (stderr, "bad magic number\n");
+ exit (1);
+ }
+
+ if (hdr.a_syms == 0) {
+ fprintf (stderr, "no symbols\n");
+ exit (1);
+ }
+
+ fseek (f, N_STROFF (hdr), 0);
+ if (fread ((char *)&old_strtab_size, sizeof (int), 1, f) != 1) {
+ fprintf (stderr, "can't read old strtab size\n");
+ exit (1);
+ }
+
+ if ((old_syms = (struct nlist *)malloc (hdr.a_syms)) == NULL
+ || ((old_strtab = malloc (old_strtab_size)) == NULL)
+ || ((new_syms = (struct nlist *)malloc (hdr.a_syms)) == NULL)
+ || ((new_strtab = malloc (old_strtab_size)) == NULL)) {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+
+ fseek (f, N_SYMOFF (hdr), 0);
+ if (fread ((char *)old_syms, hdr.a_syms, 1, f) != 1) {
+ fprintf (stderr, "can't read symbols\n");
+ exit (1);
+ }
+
+ fseek (f, N_STROFF (hdr), 0);
+ if (fread ((char *)old_strtab, old_strtab_size, 1, f) != 1) {
+ fprintf (stderr, "can't read string table\n");
+ exit (1);
+ }
+
+ num_old_syms = hdr.a_syms / sizeof (struct nlist);
+
+ new_strtab_size = 4;
+
+ nsp = new_syms;
+ for (i = 0, sp = old_syms; i < num_old_syms; i++, sp++) {
+ if (sp->n_type & N_STAB)
+ continue;
+ if (sp->n_un.n_strx == 0)
+ continue;
+
+ if (sp->n_value < 0xfe000000)
+ continue;
+
+ if (sp->n_value >= 0xff000000)
+ continue;
+
+ name = old_strtab + sp->n_un.n_strx;
+
+ len = strlen (name);
+
+ if (len == 0)
+ continue;
+
+ if (len >= 2 && name[len - 2] == '.' && name[len - 1] == 'o')
+ continue;
+
+ if (strcmp (name, "gcc_compiled.") == 0)
+ continue;
+
+ *nsp = *sp;
+
+ nsp->n_un.n_strx = new_strtab_size;
+ strcpy (new_strtab + new_strtab_size, name);
+ new_strtab_size += len + 1;
+ nsp++;
+
+ if (strcmp (name, "_db_symtab") == 0)
+ db_symtab_adr = sp->n_value;
+ if (strcmp (name, "_db_symtabsize") == 0)
+ db_symtabsize_adr = sp->n_value;
+ }
+
+ if (db_symtab_adr == 0 || db_symtabsize_adr == 0) {
+ fprintf (stderr, "couldn't find db_symtab symbols\n");
+ exit (1);
+ }
+
+ *(int *)new_strtab = new_strtab_size;
+ num_new_syms = nsp - new_syms;
+ new_syms_bytes = num_new_syms * sizeof (struct nlist);
+
+ need = sizeof (int)
+ + num_new_syms * sizeof (struct nlist)
+ + new_strtab_size;
+
+ fseek (f, FILE_OFFSET (db_symtabsize_adr), 0);
+
+ if (fread ((char *)&avail, sizeof (int), 1, f) != 1) {
+ fprintf (stderr, "can't read symtabsize\n");
+ exit (1);
+ }
+
+ printf ("dbsym: need %d; avail %d\n", need, avail);
+
+ if (need > avail) {
+ fprintf (stderr, "not enough room in db_symtab array\n");
+ exit (1);
+ }
+
+ fseek (f, FILE_OFFSET (db_symtab_adr), 0);
+ fwrite ((char *)&new_syms_bytes, sizeof (int), 1, f);
+ fwrite ((char *)new_syms, new_syms_bytes, 1, f);
+ fwrite (new_strtab, new_strtab_size, 1, f);
+ fflush (f);
+
+ if (feof (f) || ferror (f)) {
+ fprintf (stderr, "write error\n");
+ exit (1);
+ }
+ exit (0);
+}
+