Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/gen nlist for COFF



details:   https://anonhg.NetBSD.org/src/rev/382881a48f6e
branches:  trunk
changeset: 480091:382881a48f6e
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Mon Jan 03 02:13:32 2000 +0000

description:
nlist for COFF

diffstat:

 lib/libc/gen/Makefile.inc    |    4 +-
 lib/libc/gen/nlist.c         |    7 +-
 lib/libc/gen/nlist_coff.c    |  196 +++++++++++++++++++++++++++++++++++++++++++
 lib/libc/gen/nlist_private.h |    8 +-
 4 files changed, 210 insertions(+), 5 deletions(-)

diffs (275 lines):

diff -r fa8907addd6d -r 382881a48f6e lib/libc/gen/Makefile.inc
--- a/lib/libc/gen/Makefile.inc Sun Jan 02 18:44:07 2000 +0000
+++ b/lib/libc/gen/Makefile.inc Mon Jan 03 02:13:32 2000 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile.inc,v 1.102 1999/09/13 18:38:05 kleink Exp $
+#      $NetBSD: Makefile.inc,v 1.103 2000/01/03 02:13:32 msaitoh Exp $
 #      from: @(#)Makefile.inc  8.6 (Berkeley) 5/4/95
 
 # gen sources
@@ -13,7 +13,7 @@
        getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \
        getpagesize.c getpass.c getpwent.c getsubopt.c getttyent.c \
        getusershell.c __glob13.c glob.c initgroups.c isascii.c isatty.c \
-       isctype.c lockf.c nice.c nlist.c nlist_aout.c \
+       isctype.c lockf.c nice.c nlist.c nlist_aout.c nlist_coff.c \
        nlist_ecoff.c nlist_elf32.c nlist_elf64.c opendir.c \
        pause.c popen.c psignal.c pwcache.c pw_scan.c raise.c readdir.c \
        rewinddir.c scandir.c seekdir.c setdomainname.c \
diff -r fa8907addd6d -r 382881a48f6e lib/libc/gen/nlist.c
--- a/lib/libc/gen/nlist.c      Sun Jan 02 18:44:07 2000 +0000
+++ b/lib/libc/gen/nlist.c      Mon Jan 03 02:13:32 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nlist.c,v 1.15 1999/09/20 04:39:02 lukem Exp $ */
+/*     $NetBSD: nlist.c,v 1.16 2000/01/03 02:13:32 msaitoh Exp $       */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)nlist.c    8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: nlist.c,v 1.15 1999/09/20 04:39:02 lukem Exp $");
+__RCSID("$NetBSD: nlist.c,v 1.16 2000/01/03 02:13:32 msaitoh Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -68,6 +68,9 @@
 #ifdef NLIST_AOUT
        {       __fdnlist_aout          },
 #endif
+#ifdef NLIST_COFF
+       {       __fdnlist_coff          },
+#endif
 #ifdef NLIST_ECOFF
        {       __fdnlist_ecoff         },
 #endif
diff -r fa8907addd6d -r 382881a48f6e lib/libc/gen/nlist_coff.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/gen/nlist_coff.c Mon Jan 03 02:13:32 2000 +0000
@@ -0,0 +1,196 @@
+/*     $NetBSD: nlist_coff.c,v 1.1 2000/01/03 02:13:32 msaitoh Exp $   */
+
+/*
+ * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Christopher G. Demetriou
+ *     for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+__RCSID("$NetBSD: nlist_coff.c,v 1.1 2000/01/03 02:13:32 msaitoh Exp $");
+#endif /* LIBC_SCCS and not lint */
+
+#include "namespace.h"
+#include <sys/param.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <a.out.h>                     /* for 'struct nlist' declaration */
+
+#include "nlist_private.h"
+#ifdef NLIST_COFF
+#include <sys/exec_coff.h>
+#endif
+
+#ifdef NLIST_COFF
+#define        check(off, size)        ((off < 0) || (off + size > mappedsize))
+#define        BAD                     do { rv = -1; goto out; } while (0)
+#define        BADUNMAP                do { rv = -1; goto unmap; } while (0)
+
+#define ES_LEN 18
+struct coff_extsym {
+       union {
+               char u_name[8];
+               struct {
+                       int u_zero;
+                       int u_offset;
+               } s;
+       } u;
+       int32_t es_value;
+       int16_t es_scnum;
+       int16_t es_type;
+       int8_t es_class;
+       int8_t es_numaux;
+};
+#define es_name u.u_name
+#define es_zero u.s.u_zero
+#define es_offset u.s.u_offset
+
+int
+__fdnlist_coff(fd, list)
+       int fd;
+       struct nlist *list;
+{
+       struct nlist *p;
+       struct coff_filehdr *filehdrp;
+       struct stat st;
+       char *mappedfile;
+       size_t mappedsize;
+       u_long symoff, extstroff;
+       int rv, nent;
+       long i, nesyms;
+
+       _DIAGASSERT(fd != -1);
+       _DIAGASSERT(list != NULL);
+
+       rv = -1;
+
+       /*
+        * If we can't fstat() the file, something bad is going on.
+        */
+       if (fstat(fd, &st) < 0)
+               BAD;
+
+       /*
+        * Map the file in its entirety.
+        */
+       if (st.st_size > SIZE_T_MAX) {
+               errno = EFBIG;
+               BAD;
+       }
+       mappedsize = st.st_size;
+       mappedfile = mmap(NULL, mappedsize, PROT_READ, MAP_PRIVATE|MAP_FILE,
+           fd, 0);
+       if (mappedfile == (char *)-1)
+               BAD;
+
+       /*
+        * Make sure we can access the executable's header
+        * directly, and make sure the recognize the executable
+        * as an COFF binary.
+        */
+       if (check(0, sizeof *filehdrp))
+               BADUNMAP;
+       filehdrp = (struct coff_filehdr *)&mappedfile[0];
+
+       if (COFF_BADMAG(filehdrp))
+               BADUNMAP;
+
+       /*
+        * Find the symbol list.
+        */
+       symoff = filehdrp->f_symptr;
+       nesyms = filehdrp->f_nsyms;
+
+       if (check(symoff, ES_LEN * nesyms))
+               BADUNMAP;
+       extstroff = symoff + ES_LEN * nesyms;
+
+       nent = 0;
+       for (p = list; !ISLAST(p); ++p) {
+               p->n_type = 0;
+               p->n_other = 0;
+               p->n_desc = 0;
+               p->n_value = 0;
+               ++nent;
+       }
+
+       for (i = 0; i < nesyms; i++) {
+               char *symtabname;
+               char *nlistname;
+               struct coff_extsym esym;
+               char name[10];
+
+               memcpy(&esym, &mappedfile[symoff + ES_LEN * i], ES_LEN);
+               if (esym.es_numaux != 0) {
+                       i += esym.es_numaux;    /* XXX Skip aux entry */
+                       continue;
+               }
+                       
+               if (esym.es_zero != 0) {
+                       memcpy(name, esym.es_name, 8);
+                       name[8] = 0;
+                       symtabname = name;
+               } else if (esym.es_offset != 0)
+                       symtabname = &mappedfile[extstroff + esym.es_offset];
+               else
+                       continue;
+
+               for (p = list; !ISLAST(p); p++) {
+                       nlistname = p->n_un.n_name;
+                       if (!strcmp(symtabname, nlistname)) {
+                               /*
+                                * Translate (roughly) from COFF to nlist
+                                */
+                               p->n_value = esym.es_value;
+                               p->n_type = N_EXT;              /* XXX */
+                               p->n_desc = 0;                  /* XXX */
+                               p->n_other = 0;                 /* XXX */
+
+                               if (--nent <= 0)
+                                       goto done;
+                               break;  /* into next run of outer loop */
+                       }
+               }
+       }
+
+done:
+       rv = nent;
+unmap:
+       munmap(mappedfile, mappedsize);
+out:
+       return (rv);
+}
+
+#endif /* NLIST_COFF */
diff -r fa8907addd6d -r 382881a48f6e lib/libc/gen/nlist_private.h
--- a/lib/libc/gen/nlist_private.h      Sun Jan 02 18:44:07 2000 +0000
+++ b/lib/libc/gen/nlist_private.h      Mon Jan 03 02:13:32 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nlist_private.h,v 1.6 1999/01/29 22:23:54 thorpej Exp $        */
+/*     $NetBSD: nlist_private.h,v 1.7 2000/01/03 02:13:32 msaitoh Exp $        */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -44,6 +44,9 @@
 #  define      NLIST_AOUT
 #  define      NLIST_ELF32
 #  define      NLIST_ELF64
+#elif defined(__sh__)
+#  define      NLIST_COFF
+#  define      NLIST_ELF32
 #else
 #  define      NLIST_AOUT
 /* #define     NLIST_ECOFF */
@@ -56,6 +59,9 @@
 #ifdef NLIST_AOUT
 int    __fdnlist_aout __P((int, struct nlist *));
 #endif
+#ifdef NLIST_COFF
+int    __fdnlist_coff __P((int, struct nlist *));
+#endif
 #ifdef NLIST_ECOFF
 int    __fdnlist_ecoff __P((int, struct nlist *));
 #endif



Home | Main Index | Thread Index | Old Index