summaryrefslogtreecommitdiffstats
path: root/lib/csu
diff options
context:
space:
mode:
Diffstat (limited to 'lib/csu')
-rw-r--r--lib/csu/alpha/crt1.c88
-rw-r--r--lib/csu/alpha/crtbegin.c98
-rw-r--r--lib/csu/alpha/crtend.c42
3 files changed, 120 insertions, 108 deletions
diff --git a/lib/csu/alpha/crt1.c b/lib/csu/alpha/crt1.c
index 3ef5d71..bbb55bb 100644
--- a/lib/csu/alpha/crt1.c
+++ b/lib/csu/alpha/crt1.c
@@ -1,6 +1,8 @@
/*-
* Copyright 1996-1998 John D. Polstra.
* All rights reserved.
+ * 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
@@ -10,6 +12,12 @@
* 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
@@ -31,33 +39,73 @@
#include <stdlib.h>
-typedef void (*fptr)(void);
+#ifdef HAVE_RTLD
+#include <sys/exec.h>
+#include <sys/syscall.h>
+#include <rtld.h>
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
+const Obj_Entry *__mainprog_obj;
+
+extern int __syscall (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)
-extern int _DYNAMIC;
#pragma weak _DYNAMIC
+extern int _DYNAMIC;
+#else
+/*
+ * When doing a bootstrap build, the header files for runtime
+ * loader support are not available, so this source file is
+ * compiled to a static object.
+ */
+#define Obj_Entry void
+struct ps_strings;
+#endif
+
+extern void _init(void);
+extern void _fini(void);
+extern int main(int, char **, char **);
char **environ;
char *__progname = "";
+/* The entry function. */
void
-_start(char *arguments, ...)
+_start(char **ap,
+ void (*cleanup)(void), /* from shared loader */
+ const Obj_Entry *obj, /* from shared loader */
+ struct ps_strings *ps_strings)
{
- int argc;
- char **argv;
- char **env;
-
- argv = &arguments;
- argc = * (int *) (argv - 1);
- env = argv + argc + 1;
- environ = env;
- if(argc > 0)
- __progname = argv[0];
-
- atexit(_fini);
- _init();
- exit( main(argc, argv, env) );
+ int argc;
+ char **argv;
+ char **env;
+
+ argc = * (long *) ap;
+ argv = ap + 1;
+ env = ap + 2 + argc;
+ environ = env;
+ if(argc > 0)
+ __progname = argv[0];
+
+#ifdef HAVE_RTLD
+ if (&_DYNAMIC != NULL) {
+ 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);
+ }
+#endif
+
+ atexit(_fini);
+ _init();
+ exit( main(argc, argv, env) );
}
diff --git a/lib/csu/alpha/crtbegin.c b/lib/csu/alpha/crtbegin.c
index 2a6cac7..c3fefff 100644
--- a/lib/csu/alpha/crtbegin.c
+++ b/lib/csu/alpha/crtbegin.c
@@ -1,8 +1,5 @@
-/* $Id$ */
-/* From: NetBSD: crtbegin.c,v 1.2 1997/03/21 05:47:28 cgd Exp */
-
-/*
- * Copyright (c) 1993 Paul Kranenburg
+/*-
+ * Copyright 1996-1998 John D. Polstra.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -13,11 +10,6 @@
* 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
@@ -29,92 +21,48 @@
* 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 which handles constructors and destructors,
- * and NetBSD identification.
*
- * The linker constructs the following arrays of pointers to global
- * constructors and destructors. The first element contains the
- * number of pointers in each or -1 to indicate that the run-time
- * code should figure out how many there are. The tables are also
- * null-terminated.
+ * $Id: crtbegin.c,v 1.1.1.1 1998/03/07 20:27:10 jdp Exp $
*/
-#include <sys/param.h>
-#include <sys/exec.h>
-#include <sys/exec_elf.h>
-#include <stdlib.h>
+typedef void (*fptr)(void);
-/* #include "sysident.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 fptr ctor_list[1] __attribute__((section(".ctors"))) = { (fptr) -1 };
+static fptr dtor_list[1] __attribute__((section(".dtors"))) = { (fptr) -1 };
+/* Both do_ctors() and do_dtors() live in .text (the default) */
static void
-__dtors()
+do_ctors(void)
{
- unsigned long i = (unsigned long) __DTOR_LIST__[0];
- void (**p)(void);
+ fptr *fpp;
- if (i == -1) {
- for (i = 1; __DTOR_LIST__[i] != NULL; i++)
- ;
- i--;
- }
- p = __DTOR_LIST__ + i;
- while (i--)
- (**p--)();
+ for(fpp = ctor_list + 1; *fpp != 0; ++fpp)
+ (**fpp)();
}
static void
-__ctors()
+do_dtors(void)
{
- void (**p)(void) = __CTOR_LIST__ + 1;
+ fptr *fpp;
- while (*p)
- (**p++)();
+ for(fpp = dtor_list + 1; *fpp != 0; ++fpp)
+ ;
+ while(--fpp > dtor_list)
+ (**fpp)();
}
-extern void __init(void) __attribute__((section(".init")));
+extern void _init(void) __attribute__((section(".init")));
void
-__init()
+_init(void)
{
- static int initialized = 0;
-
- /*
- * Call global constructors.
- * Arrange to call global destructors at exit.
- */
- if (!initialized) {
- initialized = 1;
- __ctors();
- }
-
+ do_ctors();
}
-extern void __fini(void) __attribute__((section(".fini")));
+extern void _fini(void) __attribute__((section(".fini")));
void
-__fini()
+_fini(void)
{
- /*
- * Call global destructors.
- */
- __dtors();
+ do_dtors();
}
-
-#endif /* !ECOFF_COMPAT */
diff --git a/lib/csu/alpha/crtend.c b/lib/csu/alpha/crtend.c
index 826aa45..b82bb0d 100644
--- a/lib/csu/alpha/crtend.c
+++ b/lib/csu/alpha/crtend.c
@@ -1,15 +1,31 @@
-/* $Id$ */
-/* From: NetBSD: crtend.c,v 1.2 1997/10/10 08:45:30 mrg Exp */
+/*-
+ * Copyright 1996-1998 John D. Polstra.
+ * 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.
+ *
+ * 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.
+ *
+ * $Id: crtend.c,v 1.1.1.1 1998/03/07 20:27:10 jdp Exp $
+ */
-#ifndef ECOFF_COMPAT
+typedef void (*fptr)(void);
-#include <sys/cdefs.h>
-
-static void (*__CTOR_LIST__[1]) __P((void))
- __attribute__((__unused__))
- __attribute__((section(".ctors"))) = { (void *)0 }; /* XXX */
-static void (*__DTOR_LIST__[1]) __P((void))
- __attribute__((__unused__))
- __attribute__((section(".dtors"))) = { (void *)0 }; /* XXX */
-
-#endif /* !ECOFF_COMPAT */
+static fptr ctor_end[1] __attribute__((section(".ctors"))) = { 0 };
+static fptr dtor_end[1] __attribute__((section(".dtors"))) = { 0 };
OpenPOWER on IntegriCloud