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