Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Mar 2012 20:04:10 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232832 - in head/lib/csu: . amd64 arm common i386-elf mips powerpc powerpc64 sparc64
Message-ID:  <201203112004.q2BK4ACL024929@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Mar 11 20:04:09 2012
New Revision: 232832
URL: http://svn.freebsd.org/changeset/base/232832

Log:
  Stop calling _init/_fini methods from crt1 for dynamic binaries.  Do
  call preinit, init and fini arrays methods from crt1 for static binaries.
  
  Mark new crt1 with FreeBSD-specific ELF note.
  
  Move some common crt1 code into new MI file ignore_init.c, to reduce
  duplication.  Also, conservatively adjust nearby sources for style.
  
  Reviewed by:	kan
  Tested by:	andrew (arm), flo (sparc64)
  MFC after:	3 weeks

Added:
  head/lib/csu/common/ignore_init.c   (contents, props changed)
Modified:
  head/lib/csu/Makefile.inc
  head/lib/csu/amd64/Makefile
  head/lib/csu/amd64/crt1.c
  head/lib/csu/arm/Makefile
  head/lib/csu/arm/crt1.c
  head/lib/csu/common/crtbrand.c
  head/lib/csu/i386-elf/Makefile
  head/lib/csu/i386-elf/crt1_c.c
  head/lib/csu/mips/Makefile
  head/lib/csu/mips/crt1.c
  head/lib/csu/powerpc/Makefile
  head/lib/csu/powerpc/crt1.c
  head/lib/csu/powerpc64/Makefile
  head/lib/csu/powerpc64/crt1.c
  head/lib/csu/sparc64/crt1.c

Modified: head/lib/csu/Makefile.inc
==============================================================================
--- head/lib/csu/Makefile.inc	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/Makefile.inc	Sun Mar 11 20:04:09 2012	(r232832)
@@ -2,4 +2,6 @@
 
 SSP_CFLAGS=
 
+SED_FIX_NOTE = -i "" -e '/\.note\.tag/s/progbits/note/'
+
 .include "../Makefile.inc"

Modified: head/lib/csu/amd64/Makefile
==============================================================================
--- head/lib/csu/amd64/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/amd64/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -19,21 +19,21 @@ CLEANFILES+=	crt1.s gcrt1.s Scrt1.s
 
 crt1.s: crt1.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1.o: crt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s
 
 gcrt1.s: crt1.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1.o: gcrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
 
 Scrt1.s: crt1.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1.o: Scrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s

Modified: head/lib/csu/amd64/crt1.c
==============================================================================
--- head/lib/csu/amd64/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/amd64/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -37,16 +37,10 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
-
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
+#include "ignore_init.c"
 
 typedef void (*fptr)(void);
 
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
-
 #ifdef GCRT
 extern void _mcleanup(void);
 extern void monstartup(void *, void *);
@@ -54,9 +48,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
-
 void _start(char **, void (*)(void));
 
 /* The entry function. */
@@ -66,18 +57,13 @@ _start(char **ap, void (*cleanup)(void))
 	int argc;
 	char **argv;
 	char **env;
-	const char *s;
 
 	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]);
 
 	if (&_DYNAMIC != NULL)
 		atexit(cleanup);
@@ -86,12 +72,10 @@ _start(char **ap, void (*cleanup)(void))
 
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 __asm__("eprol:");
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }

Modified: head/lib/csu/arm/Makefile
==============================================================================
--- head/lib/csu/arm/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/arm/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -18,21 +18,21 @@ CLEANFILES+=	crt1.s gcrt1.s Scrt1.s
 
 crt1.s: crt1.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1.o: crt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s
 
 gcrt1.s: crt1.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1.o: gcrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
 
 Scrt1.s: crt1.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1.o: Scrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s

Modified: head/lib/csu/arm/crt1.c
==============================================================================
--- head/lib/csu/arm/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/arm/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -52,16 +52,11 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
+#include "ignore_init.c"
 
 struct Struct_Obj_Entry;
 struct ps_strings;
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
 extern void _start(int, char **, char **, const struct Struct_Obj_Entry *,
     void (*)(void), struct ps_strings *);
 
@@ -72,8 +67,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
 struct ps_strings *__ps_strings;
 
 void __start(int, char **, char **, struct ps_strings *,
@@ -104,16 +97,11 @@ void
 __start(int argc, char **argv, char **env, struct ps_strings *ps_strings,
     const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void))
 {
-	const char *s;
 
 	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]);
 
 	if (ps_strings != (struct ps_strings *)0)
 		__ps_strings = ps_strings;
@@ -124,13 +112,10 @@ __start(int argc, char **argv, char **en
 		_init_tls();
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 #ifdef GCRT

Modified: head/lib/csu/common/crtbrand.c
==============================================================================
--- head/lib/csu/common/crtbrand.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/common/crtbrand.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -27,10 +27,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-
-#define ABI_VENDOR	"FreeBSD"
-#define ABI_SECTION	".note.ABI-tag"
-#define ABI_NOTETYPE	1
+#include "notes.h"
 
 /*
  * Special ".note" entry specifying the ABI version.  See
@@ -55,15 +52,15 @@ __FBSDID("$FreeBSD$");
  * These steps are done in the invididual Makefiles for each applicable arch.
  */
 static const struct {
-    int32_t	namesz;
-    int32_t	descsz;
-    int32_t	type;
-    char	name[sizeof ABI_VENDOR];
-    int32_t	desc;
-} abitag __attribute__ ((section (ABI_SECTION), aligned(4))) __used = {
-    sizeof ABI_VENDOR,
-    sizeof(int32_t),
-    ABI_NOTETYPE,
-    ABI_VENDOR,
-    __FreeBSD_version
+	int32_t	namesz;
+	int32_t	descsz;
+	int32_t	type;
+	char	name[sizeof(NOTE_FREEBSD_VENDOR)];
+	int32_t	desc;
+} abitag __attribute__ ((section (NOTE_SECTION), aligned(4))) __used = {
+	.namesz = sizeof(NOTE_FREEBSD_VENDOR),
+	.descsz = sizeof(int32_t),
+	.type = ABI_NOTETYPE,
+	.name = NOTE_FREEBSD_VENDOR,
+	.desc = __FreeBSD_version
 };

Added: head/lib/csu/common/ignore_init.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/csu/common/ignore_init.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -0,0 +1,114 @@
+/*-
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "notes.h"
+
+extern int main(int, char **, char **);
+
+extern void (*__preinit_array_start[])(int, char **, char **) __hidden;
+extern void (*__preinit_array_end[])(int, char **, char **) __hidden;
+extern void (*__init_array_start[])(int, char **, char **) __hidden;
+extern void (*__init_array_end[])(int, char **, char **) __hidden;
+extern void (*__fini_array_start[])(void) __hidden;
+extern void (*__fini_array_end[])(void) __hidden;
+extern void _fini(void) __hidden;
+extern void _init(void) __hidden;
+
+extern int _DYNAMIC;
+#pragma weak _DYNAMIC
+
+char **environ;
+const char *__progname = "";
+
+static void
+finalizer(void)
+{
+	void (*fn)(void);
+	size_t array_size, n;
+
+	array_size = __fini_array_end - __fini_array_start;
+	for (n = array_size; n > 0; n--) {
+		fn = __fini_array_start[n - 1];
+		if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1)
+			(fn)();
+	}
+	_fini();
+}
+
+static inline void
+handle_static_init(int argc, char **argv, char **env)
+{
+	void (*fn)(int, char **, char **);
+	size_t array_size, n;
+
+	if (&_DYNAMIC != NULL)
+		return;
+
+	atexit(finalizer);
+
+	array_size = __preinit_array_end - __preinit_array_start;
+	for (n = 0; n < array_size; n++) {
+		fn = __preinit_array_start[n];
+		if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1)
+			fn(argc, argv, env);
+	}
+	_init();
+	array_size = __init_array_end - __init_array_start;
+	for (n = 0; n < array_size; n++) {
+		fn = __init_array_start[n];
+		if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1)
+			fn(argc, argv, env);
+	}
+}
+
+static inline void
+handle_progname(const char *v)
+{
+	const char *s;
+
+	__progname = v;
+	for (s = __progname; *s != '\0'; s++) {
+		if (*s == '/')
+			__progname = s + 1;
+	}
+}
+
+static const struct {
+	int32_t	namesz;
+	int32_t	descsz;
+	int32_t	type;
+	char	name[sizeof(NOTE_FREEBSD_VENDOR)];
+	uint32_t desc;
+} crt_noinit_tag __attribute__ ((section (NOTE_SECTION),
+    aligned(4))) __used = {
+	.namesz = sizeof(NOTE_FREEBSD_VENDOR),
+	.descsz = sizeof(uint32_t),
+	.type = CRT_NOINIT_NOTETYPE,
+	.name = NOTE_FREEBSD_VENDOR,
+	.desc = 0
+};

Modified: head/lib/csu/i386-elf/Makefile
==============================================================================
--- head/lib/csu/i386-elf/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/i386-elf/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -18,7 +18,7 @@ CLEANFILES+=	crt1_c.s gcrt1_c.s Scrt1_c.
 
 gcrt1_c.s: crt1_c.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1_c.o: gcrt1_c.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1_c.s
@@ -28,7 +28,7 @@ gcrt1.o: gcrt1_c.o crt1_s.o
 
 crt1_c.s: crt1_c.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1_c.o: crt1_c.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1_c.s
@@ -39,7 +39,7 @@ crt1.o:	crt1_c.o crt1_s.o
 
 Scrt1_c.s: crt1_c.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1_c.o: Scrt1_c.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1_c.s

Modified: head/lib/csu/i386-elf/crt1_c.c
==============================================================================
--- head/lib/csu/i386-elf/crt1_c.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/i386-elf/crt1_c.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -39,15 +39,10 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
-
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
+#include "ignore_init.c"
 
 typedef void (*fptr)(void);
 
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
 extern void _start(char *, ...);
 
 #ifdef GCRT
@@ -57,9 +52,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
-
 void _start1(fptr, int, char *[]) __dead2;
 
 /* The entry function, C part. */
@@ -67,16 +59,11 @@ void
 _start1(fptr cleanup, int argc, char *argv[])
 {
 	char **env;
-	const char *s;
 
 	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]);
 
 	if (&_DYNAMIC != NULL)
 		atexit(cleanup);
@@ -85,14 +72,12 @@ _start1(fptr cleanup, int argc, char *ar
 
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 __asm__("eprol:");
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 __asm(".hidden	_start1");

Modified: head/lib/csu/mips/Makefile
==============================================================================
--- head/lib/csu/mips/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/mips/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -18,21 +18,21 @@ CLEANFILES+=	crt1.s gcrt1.s Scrt1.s
 
 crt1.s: crt1.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1.o: crt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s
 
 gcrt1.s: crt1.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1.o: gcrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
 
 Scrt1.s: crt1.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1.o: Scrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s

Modified: head/lib/csu/mips/crt1.c
==============================================================================
--- head/lib/csu/mips/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/mips/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -43,17 +43,11 @@ __FBSDID("$FreeBSD$");
 #include <stdlib.h>
 #include "libc_private.h"
 #include "crtbrand.c"
+#include "ignore_init.c"
 
 struct Struct_Obj_Entry;
 struct ps_strings;
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
-extern void _init(void);
-extern void _fini(void);
-extern int main(int, char **, char **);
-
 #ifdef GCRT
 extern void _mcleanup(void);
 extern void monstartup(void *, void *);
@@ -61,9 +55,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
-
 void __start(char **, void (*)(void), struct Struct_Obj_Entry *, struct ps_strings *);
 
 /* The entry function. */
@@ -81,13 +72,8 @@ __start(char **ap,
 	argv = ap + 1;
 	env  = ap + 2 + argc;
 	environ = env;
-	if (argc > 0 && argv[0] != NULL) {
-		const char *s;
-		__progname = argv[0];
-		for (s = __progname; *s != '\0'; s++)
-			if (*s == '/')
-				__progname = s + 1;
-	}
+	if (argc > 0 && argv[0] != NULL)
+		handle_progname(argv[0]);
 
 	if (&_DYNAMIC != NULL)
 		atexit(cleanup);
@@ -96,13 +82,11 @@ __start(char **ap,
 
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 #ifdef GCRT

Modified: head/lib/csu/powerpc/Makefile
==============================================================================
--- head/lib/csu/powerpc/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/powerpc/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -18,21 +18,21 @@ CLEANFILES+=	crt1.s gcrt1.s Scrt1.s
 
 crt1.s: crt1.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1.o: crt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s
 
 gcrt1.s: crt1.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1.o: gcrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
 
 Scrt1.s: crt1.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1.o: Scrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s

Modified: head/lib/csu/powerpc/crt1.c
==============================================================================
--- head/lib/csu/powerpc/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/powerpc/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -52,17 +52,11 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
+#include "ignore_init.c"
 
 struct Struct_Obj_Entry;
 struct ps_strings;
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
-
 #ifdef GCRT
 extern void _mcleanup(void);
 extern void monstartup(void *, void *);
@@ -70,8 +64,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
 struct ps_strings *__ps_strings;
 
 void _start(int, char **, char **, const struct Struct_Obj_Entry *,
@@ -88,16 +80,11 @@ _start(int argc, char **argv, char **env
     const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void),
     struct ps_strings *ps_strings)
 {
-	const char *s;
 
 	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]);
 
 	if (ps_strings != (struct ps_strings *)0)
 		__ps_strings = ps_strings;
@@ -109,13 +96,11 @@ _start(int argc, char **argv, char **env
 
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 #ifdef GCRT

Modified: head/lib/csu/powerpc64/Makefile
==============================================================================
--- head/lib/csu/powerpc64/Makefile	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/powerpc64/Makefile	Sun Mar 11 20:04:09 2012	(r232832)
@@ -18,21 +18,21 @@ CLEANFILES+=	crt1.s gcrt1.s Scrt1.s
 
 crt1.s: crt1.c
 	${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 crt1.o: crt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} crt1.s
 
 gcrt1.s: crt1.c
 	${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 gcrt1.o: gcrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} gcrt1.s
 
 Scrt1.s: crt1.c
 	${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
-	sed -i "" -e '/\.note\.ABI-tag/s/progbits/note/' ${.TARGET}
+	sed ${SED_FIX_NOTE} ${.TARGET}
 
 Scrt1.o: Scrt1.s
 	${CC} ${CFLAGS} -c -o ${.TARGET} Scrt1.s

Modified: head/lib/csu/powerpc64/crt1.c
==============================================================================
--- head/lib/csu/powerpc64/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/powerpc64/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -52,16 +52,11 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
+#include "ignore_init.c"
 
 struct Struct_Obj_Entry;
 struct ps_strings;
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
 extern void _start(int, char **, char **, const struct Struct_Obj_Entry *,
     void (*)(void), struct ps_strings *);
 
@@ -72,8 +67,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
 struct ps_strings *__ps_strings;
 
 /* The entry function. */
@@ -87,16 +80,11 @@ _start(int argc, char **argv, char **env
     const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void),
     struct ps_strings *ps_strings)
 {
-	const char *s;
 
 	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]);
 
 	if (ps_strings != (struct ps_strings *)0)
 		__ps_strings = ps_strings;
@@ -108,13 +96,11 @@ _start(int argc, char **argv, char **env
 
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 #ifdef GCRT

Modified: head/lib/csu/sparc64/crt1.c
==============================================================================
--- head/lib/csu/sparc64/crt1.c	Sun Mar 11 20:03:09 2012	(r232831)
+++ head/lib/csu/sparc64/crt1.c	Sun Mar 11 20:04:09 2012	(r232832)
@@ -43,16 +43,11 @@ __FBSDID("$FreeBSD$");
 
 #include "libc_private.h"
 #include "crtbrand.c"
+#include "ignore_init.c"
 
 struct Struct_Obj_Entry;
 struct ps_strings;
 
-extern int _DYNAMIC;
-#pragma weak _DYNAMIC
-
-extern void _fini(void);
-extern void _init(void);
-extern int main(int, char **, char **);
 extern void __sparc_utrap_setup(void);
 
 #ifdef GCRT
@@ -62,9 +57,6 @@ extern int eprol;
 extern int etext;
 #endif
 
-char **environ;
-const char *__progname = "";
-
 void _start(char **, void (*)(void), struct Struct_Obj_Entry *,
     struct ps_strings *);
 
@@ -89,18 +81,13 @@ _start(char **ap, void (*cleanup)(void),
 	int argc;
 	char **argv;
 	char **env;
-	const char *s;
 
 	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]);
 
 	if (&_DYNAMIC != NULL)
 		atexit(cleanup);
@@ -110,13 +97,11 @@ _start(char **ap, void (*cleanup)(void),
 	}
 #ifdef GCRT
 	atexit(_mcleanup);
-#endif
-	atexit(_fini);
-#ifdef GCRT
 	monstartup(&eprol, &etext);
 #endif
-	_init();
-	exit( main(argc, argv, env) );
+
+	handle_static_init(argc, argv, env);
+	exit(main(argc, argv, env));
 }
 
 #ifdef GCRT



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203112004.q2BK4ACL024929>