diff options
Diffstat (limited to 'lang/elk')
-rw-r--r-- | lang/elk/Makefile | 10 | ||||
-rw-r--r-- | lang/elk/files/stab-elf.c | 96 |
2 files changed, 99 insertions, 7 deletions
diff --git a/lang/elk/Makefile b/lang/elk/Makefile index 4659a2b7e40..c247a4b0863 100644 --- a/lang/elk/Makefile +++ b/lang/elk/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.15 2000/08/23 21:53:55 wiz Exp $ +# $NetBSD: Makefile,v 1.16 2000/10/05 15:08:54 agc Exp $ # FreeBSD Id: Makefile,v 1.15 1997/09/01 12:28:30 tg Exp # @@ -15,13 +15,9 @@ NOT_FOR_PLATFORM= *-*-alpha *-*-mips* #elf loading problems, LP64 ALL_TARGET= default USE_X11= yes -.include "../../mk/bsd.prefs.mk" - -.if ${OBJECT_FMT} == "ELF" && ${OPSYS} == "NetBSD" -IGNORE+= "${PKGNAME} has not yet been ported to NetBSD ELF platforms" -.endif - do-configure: + ${MV} ${WRKSRC}/src/stab-elf.c ${WRKSRC}/src/stab-elf.c-dist + ${CP} ${FILESDIR}/stab-elf.c ${WRKSRC}/src @case `${MAKE} show-shlib-type` in \ a.out) exetype=aout ;; \ ELF) exetype=elf ;; \ diff --git a/lang/elk/files/stab-elf.c b/lang/elk/files/stab-elf.c new file mode 100644 index 00000000000..e93d2835b81 --- /dev/null +++ b/lang/elk/files/stab-elf.c @@ -0,0 +1,96 @@ +/* $NetBSD: stab-elf.c,v 1.1 2000/10/05 15:08:54 agc Exp $ */ + +/* + * Copyright (c) 2000 Alistair G. Crooks. 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 Alistair G. Crooks. + * 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> + +#ifndef lint +__COPYRIGHT( + "@(#) Copyright (c) 2000 \ + The NetBSD Foundation, Inc. All rights reserved."); +__RCSID("$NetBSD: stab-elf.c,v 1.1 2000/10/05 15:08:54 agc Exp $"); +#endif + +#include <sys/types.h> +#include <sys/param.h> + +#include <elf.h> +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#ifndef AWK +#define AWK "/usr/bin/awk" +#endif + +#ifndef NM +#define NM "/usr/bin/nm" +#endif + +#ifdef __ELF__ +#define NAME_OFFSET 0 +#else +#define NAME_OFFSET 1 +#endif + +SYMTAB * +Open_File_And_Snarf_Symbols (name) + char *name; +{ + SYMTAB *tab = NULL; + FILE *pp; + char cmd[MAXPATHLEN + 200]; + char buf[BUFSIZ]; + SYM **nextp; + SYM *sp; + + (void) snprintf(cmd, sizeof(cmd), "%s %s | %s '$2 == \"T\" { printf(\"%s %s\n\", $1 $3) }'", NM, name, AWK); + if ((pp = popen(cmd, "r")) == NULL) { + Primitive_Error("can't open a.out file"); + } + tab = (SYMTAB *)Safe_Malloc (sizeof (SYMTAB)); + tab->first = 0; + tab->strings = 0; + nextp = &tab->first; + while (fgets(buf, sizeof(buf), pp) != NULL) { + sp = (SYM *)Safe_Malloc(sizeof (SYM)); + sp->name = Safe_Malloc(strlen(buf) + 1 - 8 - 1); + (void) strcpy(sp->name, &buf[8 + 1 + NAME_OFFSET]); + (void) sscanf(buf, "%08x", &sp->value); + *nextp = sp; + nextp = &sp->next; + *nextp = 0; + } + (void) pclose(pp); + return tab; +} |