Module Name:    src
Committed By:   matt
Date:           Thu Jan 31 22:24:25 UTC 2013

Modified Files:
        src/lib/csu/common: crt0-common.c

Log Message:
Add support for PREINIT_ARRAY


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/lib/csu/common/crt0-common.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/csu/common/crt0-common.c
diff -u src/lib/csu/common/crt0-common.c:1.12 src/lib/csu/common/crt0-common.c:1.13
--- src/lib/csu/common/crt0-common.c:1.12	Mon Jan 28 16:56:39 2013
+++ src/lib/csu/common/crt0-common.c	Thu Jan 31 22:24:25 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0-common.c,v 1.12 2013/01/28 16:56:39 matt Exp $ */
+/* $NetBSD: crt0-common.c,v 1.13 2013/01/31 22:24:25 matt Exp $ */
 
 /*
  * Copyright (c) 1998 Christos Zoulas
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: crt0-common.c,v 1.12 2013/01/28 16:56:39 matt Exp $");
+__RCSID("$NetBSD: crt0-common.c,v 1.13 2013/01/31 22:24:25 matt Exp $");
 
 #include <sys/types.h>
 #include <sys/exec.h>
@@ -95,6 +95,10 @@ do {						\
  * Since we don't need .init or .fini sections, just code them in C
  * to make life easier.
  */
+__weakref_visible const fptr_t preinit_array_start[1]
+    __weak_reference(__preinit_array_start);
+__weakref_visible const fptr_t preinit_array_end[1]
+    __weak_reference(__preinit_array_end);
 __weakref_visible const fptr_t init_array_start[1]
     __weak_reference(__init_array_start);
 __weakref_visible const fptr_t init_array_end[1]
@@ -105,6 +109,14 @@ __weakref_visible const fptr_t fini_arra
     __weak_reference(__fini_array_end);
 
 static inline void
+_preinit(void)
+{
+	for (const fptr_t *f = preinit_array_start; f < preinit_array_end; f++) {
+		(*f)();
+	}
+}
+
+static inline void
 _init(void)
 {
 	for (const fptr_t *f = init_array_start; f < init_array_end; f++) {
@@ -156,6 +168,10 @@ ___start(void (*cleanup)(void),			/* fro
 
 	_libc_init();
 
+#ifdef HAVE_INITFINI_ARRAY
+	_preinit();
+#endif
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&__eprol, (u_long)&__etext);

Reply via email to