crtstuff: refactor
authorJohn Marino <draco@marino.st>
Sat, 17 Mar 2012 15:37:14 +0000 (16:37 +0100)
committerJohn Marino <draco@marino.st>
Sun, 18 Mar 2012 02:11:55 +0000 (03:11 +0100)
Add common/initfini.c file to provide common prototypes and functions
to all DragonFly arches, particularly focusing on the various types
of initialization and finalization.

lib/csu/common/initfini.c [new file with mode: 0644]
lib/csu/i386/crt1_c.c
lib/csu/x86_64/crt1.c

diff --git a/lib/csu/common/initfini.c b/lib/csu/common/initfini.c
new file mode 100644 (file)
index 0000000..75b3858
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * Copyright 2012 Konstantin Belousov <kib@FreeBSD.org>
+ * 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.
+ */
+
+extern int main(int, char **, char **);
+
+extern void (*__preinit_array_start []) (int, char **, char **) __dso_hidden;
+extern void (*__preinit_array_end   []) (int, char **, char **) __dso_hidden;
+extern void (*__init_array_start    []) (int, char **, char **) __dso_hidden;
+extern void (*__init_array_end      []) (int, char **, char **) __dso_hidden;
+extern void (*__fini_array_start    []) (void) __dso_hidden;
+extern void (*__fini_array_end      []) (void) __dso_hidden;
+extern void _fini(void);
+extern void _init(void);
+
+extern int _DYNAMIC;
+#pragma weak _DYNAMIC
+
+char **environ;
+const char *__progname = "";
+
+static inline void
+handle_progname(const char *v)
+{
+       const char *s;
+
+       __progname = v;
+       for (s = __progname; *s != '\0'; s++) {
+               if (*s == '/')
+                       __progname = s + 1;
+       }
+}
+
index 127a012..1753733 100644 (file)
@@ -22,7 +22,7 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/csu/i386-elf/crt1.c, svn 200038 2009/12/02 kib $
+ * $FreeBSD$
  */
 
 #ifndef __GNUC__
 #include <stdlib.h>
 
 #include "libc_private.h"
+#include "initfini.c"
 #include "crtbrand.c"
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
 typedef void (*fptr)(void);
 
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
-
-extern void (*__preinit_array_start []) (int, char **, char **) __dso_hidden;
-extern void (*__preinit_array_end   []) (int, char **, char **) __dso_hidden;
-extern void (*__init_array_start    []) (int, char **, char **) __dso_hidden;
-extern void (*__init_array_end      []) (int, char **, char **) __dso_hidden;
-extern void (*__fini_array_start    []) (void) __dso_hidden;
-extern void (*__fini_array_end      []) (void) __dso_hidden;
+extern void _start(char *, ...);
 
 #ifdef GCRT
 extern void _mcleanup(void);
@@ -59,9 +48,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
-
 void _start1(fptr, int, char *[]) __dead2;
 
 /* The entry function, C part. */
@@ -69,17 +55,12 @@ void
 _start1(fptr cleanup, int argc, char *argv[])
 {
     char **env;
-    const char *s;
     size_t n, array_size;
 
     env = argv + argc + 1;
     environ = env;
-    if (argc > 0 && argv[0] != NULL) {
-       __progname = argv[0];
-       for (s = __progname; *s != '\0'; s++)
-           if (*s == '/')
-               __progname = s + 1;
-    }
+       if (argc > 0 && argv[0] != NULL)
+               handle_progname(argv[0]);
 
     /*
      * Setup the initial TLS space.  The RTLD does not set up our TLS
@@ -124,7 +105,7 @@ __asm__("eprol:");
     array_size = __init_array_end - __init_array_start;
     for (n = 0; n < array_size; n++)
        (*__init_array_start [n])(argc, argv, env);
-    exit( main(argc, argv, env) );
+    exit(main(argc, argv, env));
 }
 
-__asm(".hidden  _start1");
+__asm(".hidden _start1");
index 35f23d7..163c48c 100644 (file)
@@ -1,4 +1,3 @@
-/* LINTLIBRARY */
 /*-
  * Copyright 1996-1998 John D. Polstra.
  * All rights reserved.
  * 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.
- *
- * $FreeBSD: src/lib/csu/amd64/crt1.c,v 1.13 2003/04/30 19:27:07 peter Exp $
  */
 
-#ifndef lint
 #ifndef __GNUC__
 #error "GCC is needed to compile this file"
 #endif
-#endif /* lint */
 
 #include <machine/tls.h>
 #include <stdlib.h>
 
 #include "libc_private.h"
+#include "initfini.c"
 #include "crtbrand.c"
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
 typedef void (*fptr)(void);
 
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
-extern void _start(char **, void (*)(void));
-
-extern void (*__preinit_array_start []) (int, char **, char **) __dso_hidden;
-extern void (*__preinit_array_end   []) (int, char **, char **) __dso_hidden;
-extern void (*__init_array_start    []) (int, char **, char **) __dso_hidden;
-extern void (*__init_array_end      []) (int, char **, char **) __dso_hidden;
-extern void (*__fini_array_start    []) (void) __dso_hidden;
-extern void (*__fini_array_end      []) (void) __dso_hidden;
-
 #ifdef GCRT
 extern void _mcleanup(void);
 extern void monstartup(void *, void *);
@@ -62,8 +43,7 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
+void _start(char **, void (*)(void));
 
 /* The entry function. */
 void
@@ -72,19 +52,14 @@ _start(char **ap, void (*cleanup)(void))
        int argc;
        char **argv;
        char **env;
-       const char *s;
        size_t n, array_size;
 
        argc = *(long *)(void *)ap;
        argv = ap + 1;
        env = ap + 2 + argc;
        environ = env;
-       if (argc > 0 && argv[0] != NULL) {
-               __progname = argv[0];
-               for (s = __progname; *s != '\0'; s++)
-                       if (*s == '/')
-                               __progname = s + 1;
-       }
+       if (argc > 0 && argv[0] != NULL)
+               handle_progname(argv[0]);
 
        /*
         * Setup the initial TLS space.  The RTLD does not set up our TLS
@@ -128,7 +103,7 @@ _start(char **ap, void (*cleanup)(void))
        array_size = __init_array_end - __init_array_start;
        for (n = 0; n < array_size; n++)
                (*__init_array_start [n])(argc, argv, env);
-       exit( main(argc, argv, env) );
+       exit(main(argc, argv, env));
 }
 
 #ifdef GCRT