summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/csu/alpha/Makefile52
-rw-r--r--lib/csu/alpha/crt0.c220
-rw-r--r--lib/csu/alpha/crt0.s100
-rw-r--r--lib/csu/alpha/crtbegin.c112
-rw-r--r--lib/csu/alpha/crtend.c13
5 files changed, 382 insertions, 115 deletions
diff --git a/lib/csu/alpha/Makefile b/lib/csu/alpha/Makefile
index b960baf9bf7..b9844de3215 100644
--- a/lib/csu/alpha/Makefile
+++ b/lib/csu/alpha/Makefile
@@ -1,25 +1,47 @@
-# $NetBSD: Makefile,v 1.3 1995/12/20 12:36:56 cgd Exp $
+# $OpenBSD: Makefile,v 1.4 1996/11/13 21:23:13 niklas Exp $
+# $NetBSD: Makefile,v 1.6 1996/10/18 05:27:38 thorpej Exp $
+
+.include <bsd.own.mk> # for ELF_TOOLCHAIN definition
+
+CFLAGS+= -DLIBC_SCCS -DPIC -DDYNAMIC -DELFSIZE=64
+CFLAGS+= -I${.CURDIR}/../../../libexec/elf_rtld/include
+
+.if !defined(ELF_TOOLCHAIN)
+CFLAGS+= -DECOFF_COMPAT
+.endif
+
+OBJS= crt0.o gcrt0.o crtbegin.o crtend.o
-CFLAGS+= -DLIBC_SCCS
-OBJS= crt0.o gcrt0.o
CLEANFILES+= core a.out
all: ${OBJS}
-crt0.o: crt0.s
- ${CPP} -DCRT0 ${CFLAGS:M-[ID]*} ${.ALLSRC} | ${AS} -o $@
- @${LD} -x -r ${.TARGET}
- @mv a.out ${.TARGET}
+crt0.o: crt0.c
+ @echo ${CC} ${CFLAGS} -DCRT0 -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -DCRT0 -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
-gcrt0.o: crt0.s
- ${CPP} -DMCRT0 ${CFLAGS:M-[ID]*} ${.ALLSRC} | ${AS} -o $@
- @${LD} -x -r ${.TARGET}
- @mv a.out ${.TARGET}
+gcrt0.o: crt0.c
+ @echo ${CC} ${CFLAGS} -DMCRT0 -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -DMCRT0 -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
-install:
- install ${COPY} -o ${BINOWN} -g ${BINGRP} -m 444 ${OBJS} \
- ${DESTDIR}/usr/lib
+crtbegin.o: crtbegin.c
+ @echo ${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
+
+crtend.o: crtend.c
+ @echo ${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}
+ @${CC} ${CFLAGS} -c ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -x -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
-depend lint tags:
+install:
+ ${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP} -m 444 ${OBJS} \
+ ${DESTDIR}/usr/lib
.include <bsd.prog.mk>
diff --git a/lib/csu/alpha/crt0.c b/lib/csu/alpha/crt0.c
new file mode 100644
index 00000000000..dcc280046bd
--- /dev/null
+++ b/lib/csu/alpha/crt0.c
@@ -0,0 +1,220 @@
+/* $NetBSD: crt0.c,v 1.1 1996/09/12 16:59:02 cgd Exp $ */
+
+/*
+ * Copyright (c) 1995 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.
+ */
+
+#ifdef ECOFF_COMPAT
+#undef DYNAMIC
+#endif
+
+#include <stdlib.h>
+#include <sys/syscall.h>
+#ifdef DYNAMIC
+#include "rtld.h"
+#else
+typedef void Obj_Entry;
+#endif
+
+/*
+ * Lots of the chunks of this file cobbled together from pieces of
+ * other NetBSD crt files, including the common code.
+ */
+
+extern int __syscall __P((int, ...));
+#define _exit(v) __syscall(SYS_exit, (v))
+#define write(fd, s, n) __syscall(SYS_write, (fd), (s), (n))
+
+#define _FATAL(str) \
+ do { \
+ write(2, str, sizeof(str)); \
+ _exit(1); \
+ } while (0)
+
+static char *_strrchr __P((char *, char));
+
+
+char **environ;
+char *__progname = "";
+
+#ifndef ECOFF_COMPAT
+extern void __init __P((void));
+extern void __fini __P((void));
+#endif /* ECOFF_COMPAT */
+
+#ifdef DYNAMIC
+void rtld_setup __P((void (*)(void), const Obj_Entry *obj));
+
+const Obj_Entry *mainprog_obj;
+
+/*
+ * Arrange for _DYNAMIC to exist weakly at address zero. That way,
+ * if we happen to be compiling without -static but with without any
+ * shared libs present, things will still work.
+ */
+asm(".weak _DYNAMIC; _DYNAMIC = 0");
+extern int _DYNAMIC;
+#endif /* DYNAMIC */
+
+#ifdef MCRT0
+extern void monstartup __P((u_long, u_long));
+extern void _mcleanup __P((void));
+extern unsigned char _etext, _eprol;
+#endif /* MCRT0 */
+
+void
+__start(sp, cleanup, obj)
+ char **sp;
+ void (*cleanup) __P((void)); /* from shared loader */
+ const Obj_Entry *obj; /* from shared loader */
+{
+ long argc;
+ char **argv, *namep;
+
+ argc = *(long *)sp;
+ argv = sp + 1;
+ environ = sp + 2 + argc; /* 2: argc + NULL ending argv */
+
+ if ((namep = argv[0]) != NULL) { /* NULL ptr if argc = 0 */
+ if ((__progname = _strrchr(namep, '/')) == NULL)
+ __progname = namep;
+ else
+ __progname++;
+ }
+
+#ifdef DYNAMIC
+ if (&_DYNAMIC != NULL)
+ rtld_setup(cleanup, obj);
+#endif
+
+#ifdef MCRT0
+ atexit(_mcleanup);
+ monstartup((u_long)&_eprol, (u_long)&_etext);
+#endif
+
+#ifndef ECOFF_COMPAT
+ atexit(__fini);
+ __init();
+#endif /* ECOFF_COMPAT */
+
+ exit(main(argc, argv, environ));
+}
+
+
+static char *
+_strrchr(p, ch)
+register char *p, ch;
+{
+ register char *save;
+
+ for (save = NULL;; ++p) {
+ if (*p == ch)
+ save = (char *)p;
+ if (!*p)
+ return(save);
+ }
+/* NOTREACHED */
+}
+
+#ifdef MCRT0
+asm (" .text");
+asm ("_eprol:");
+#endif
+
+#ifdef DYNAMIC
+void
+rtld_setup(cleanup, obj)
+ void (*cleanup) __P((void));
+ const Obj_Entry *obj;
+{
+
+ if ((obj == NULL) || (obj->magic != RTLD_MAGIC))
+ _FATAL("Corrupt Obj_Entry pointer in GOT");
+ if (obj->version != RTLD_VERSION)
+ _FATAL("Dynamic linker version mismatch");
+
+ mainprog_obj = obj;
+ atexit(cleanup);
+}
+
+void *
+dlopen(name, mode)
+ char *name;
+ int mode;
+{
+
+ if (mainprog_obj == NULL)
+ return NULL;
+ return (mainprog_obj->dlopen)(name, mode);
+}
+
+int
+dlclose(fd)
+ void *fd;
+{
+
+ if (mainprog_obj == NULL)
+ return -1;
+ return (mainprog_obj->dlclose)(fd);
+}
+
+void *
+dlsym(fd, name)
+ void *fd;
+ char *name;
+{
+
+ if (mainprog_obj == NULL)
+ return NULL;
+ return (mainprog_obj->dlsym)(fd, name);
+}
+
+#if 0 /* not supported for ELF shlibs, apparently */
+int
+dlctl(fd, cmd, arg)
+ void *fd, *arg;
+ int cmd;
+{
+
+ if (mainprog_obj == NULL)
+ return -1;
+ return (mainprog_obj->dlctl)(fd, cmd, arg);
+}
+#endif
+
+char *
+dlerror()
+{
+
+ if (mainprog_obj == NULL)
+ return NULL;
+ return (mainprog_obj->dlerror)();
+}
+#endif /* DYNAMIC */
diff --git a/lib/csu/alpha/crt0.s b/lib/csu/alpha/crt0.s
deleted file mode 100644
index 8528a3c827d..00000000000
--- a/lib/csu/alpha/crt0.s
+++ /dev/null
@@ -1,100 +0,0 @@
-/* $NetBSD: crt0.s,v 1.5 1996/05/16 21:56:22 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Carnegie-Mellon University.
- * All rights reserved.
- *
- * Author: Chris G. Demetriou
- *
- * Permission to use, copy, modify and distribute this software and
- * its documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
- * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- */
-
-#include <machine/asm.h>
-
-/*
- * Set up the global variables provided by crt0:
- * environ and __progname
- */
-BSS(environ, 8)
- .data
- .align 3
-EXPORT(__progname)
- .quad $L1
-$L1:
- .quad 0 /* Null string, plus padding. */
- .text
-
-LEAF(__start, 0) /* XXX */
- .set noreorder
- br pv, 1f
-1: SETGP(pv)
-
- ldq s0, 0(sp) /* get argc from stack */
- lda s1, 8(sp) /* get pointer to argv */
- s8addq s0, s1, s2 /* add number of argv pointers */
- addq s2, 8, s2 /* and skip the null pointer */
- stq s2, environ /* save the newly-found env pointer */
-
-#ifdef MCRT0
-eprol:
- lda a0, eprol
- lda a1, etext
- CALL(monstartup) /* monstartup(eprol, etext); */
- lda a0, _mcleanup
- CALL(atexit) /* atext(_mcleanup); */
- stl zero, errno
-#endif
-
- ldq a0, 0(s1) /* a0 = argv[0]; */
- beq a0, 2f /* if it's null, then punt */
- CONST(0x2f, a1) /* a1 = '/' */
- CALL(strrchr)
- addq v0, 1, a0 /* move past the /, if there was one */
- bne v0, 1f /* if a / found */
- ldq a0, 0(s1) /* a0 = argv[0]; */
-1:
- stq a0, __progname /* store the program name */
-2:
- /* call main() */
-__callmain:
- mov s0, a0
- mov s1, a1
- mov s2, a2
- CALL(main) /* v0 = main(argc, argv, env); */
-
- /* on return from main, call exit() with its return value. */
- mov v0, a0
- CALL(exit) /* exit(rv); */
-
- /* if that failed, bug out. */
- call_pal 0x81 /* XXX op_bugchk */
- .set reorder
-END(__start)
-
-#ifndef MCRT0
-LEAF(moncontrol, 0)
- RET
-END(moncontrol)
-
-LEAF(_mcount, 0)
- ret zero, (at_reg), 1
-END(_mcount)
-#endif
diff --git a/lib/csu/alpha/crtbegin.c b/lib/csu/alpha/crtbegin.c
new file mode 100644
index 00000000000..2ea2897f8b8
--- /dev/null
+++ b/lib/csu/alpha/crtbegin.c
@@ -0,0 +1,112 @@
+/* $OpenBSD: crtbegin.c,v 1.1 1996/11/13 21:28:03 niklas Exp $ */
+/* $NetBSD: crtbegin.c,v 1.1 1996/09/12 16:59:03 cgd Exp $ */
+
+/*
+ * Copyright (c) 1993 Paul Kranenburg
+ * 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 Paul Kranenburg.
+ * 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.
+ */
+
+#ifndef ECOFF_COMPAT
+
+/*
+ * XXX EVENTUALLY SHOULD BE MERGED BACK WITH c++rt0.c
+ */
+
+/*
+ * Run-time module for GNU C++ compiled shared libraries.
+ *
+ * The linker constructs the following arrays of pointers to global
+ * constructors and destructors. The first element contains the
+ * number of pointers in each.
+ * The tables are also null-terminated.
+ */
+#include <stdlib.h>
+
+static void (*__CTOR_LIST__[1]) __P((void))
+ __attribute__((section(".ctors"))) = { (void *)-1 }; /* XXX */
+static void (*__DTOR_LIST__[1]) __P((void))
+ __attribute__((section(".dtors"))) = { (void *)-1 }; /* XXX */
+
+static void __dtors __P((void));
+static void __ctors __P((void));
+
+static void
+__dtors()
+{
+ unsigned long i = (unsigned long) __DTOR_LIST__[0];
+ void (**p)(void);
+
+ if (i == -1) {
+ for (i = 1; __DTOR_LIST__[i] != NULL; i++)
+ ;
+ i--;
+ }
+ p = __DTOR_LIST__ + i;
+ while (i--)
+ (**p--)();
+}
+
+static void
+__ctors()
+{
+ void (**p)(void) = __CTOR_LIST__ + 1;
+
+ while (*p)
+ (**p++)();
+}
+
+extern void __init(void) __attribute__((section(".init")));
+
+void
+__init()
+{
+ static int initialized = 0;
+
+ /*
+ * Call global constructors.
+ * Arrange to call global destructors at exit.
+ */
+ if (!initialized) {
+ initialized = 1;
+ __ctors();
+ }
+
+}
+
+extern void __fini(void) __attribute__((section(".fini")));
+
+void
+__fini()
+{
+ /*
+ * Call global destructors.
+ */
+ __dtors();
+}
+
+#endif /* !ECOFF_COMPAT */
diff --git a/lib/csu/alpha/crtend.c b/lib/csu/alpha/crtend.c
new file mode 100644
index 00000000000..6e446b76a6b
--- /dev/null
+++ b/lib/csu/alpha/crtend.c
@@ -0,0 +1,13 @@
+/* $OpenBSD: crtend.c,v 1.1 1996/11/13 21:28:04 niklas Exp $ */
+/* $NetBSD: crtend.c,v 1.1 1996/09/12 16:59:04 cgd Exp $ */
+
+#ifndef ECOFF_COMPAT
+
+#include <sys/cdefs.h>
+
+static void (*__CTOR_LIST__[1]) __P((void))
+ __attribute__((section(".ctors"))) = { (void *)0 }; /* XXX */
+static void (*__DTOR_LIST__[1]) __P((void))
+ __attribute__((section(".dtors"))) = { (void *)0 }; /* XXX */
+
+#endif /* !ECOFF_COMPAT */