[Midnightbsd-cvs] src [10423] trunk/lib/csu/common: fixup branding.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Tue Jun 5 18:43:44 EDT 2018


Revision: 10423
          http://svnweb.midnightbsd.org/src/?rev=10423
Author:   laffer1
Date:     2018-06-05 18:43:43 -0400 (Tue, 05 Jun 2018)
Log Message:
-----------
fixup branding.

Modified Paths:
--------------
    trunk/lib/csu/common/crtbrand.c

Added Paths:
-----------
    trunk/lib/csu/common/ignore_init.c

Modified: trunk/lib/csu/common/crtbrand.c
===================================================================
--- trunk/lib/csu/common/crtbrand.c	2018-06-05 22:40:42 UTC (rev 10422)
+++ trunk/lib/csu/common/crtbrand.c	2018-06-05 22:43:43 UTC (rev 10423)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright 2008 Lucas Holt
  * Copyright 2000 David E. O'Brien, John D. Polstra.
@@ -28,26 +29,40 @@
 __MBSDID("$MidnightBSD$");
 
 #include <sys/param.h>
+#include "notes.h"
 
-#define ABI_VENDOR	"MidnightBSD"
-#define ABI_SECTION	".note.ABI-tag"
-#define ABI_NOTETYPE	1
-
 /*
  * Special ".note" entry specifying the ABI version.  See
  * http://www.netbsd.org/Documentation/kernel/elf-notes.html
  * for more information.
+ *
+ * For all arches except sparc, gcc emits the section directive for the
+ * following struct with a PROGBITS type.  However, newer versions of binutils
+ * (after 2.16.90) require the section to be of NOTE type, to guarantee that the
+ * .note.ABI-tag section correctly ends up in the first page of the final
+ * executable.
+ *
+ * Unfortunately, there is no clean way to tell gcc to use another section type,
+ * so this C file (or the C file that includes it) must be compiled in multiple
+ * steps:
+ *
+ * - Compile the .c file to a .s file.
+ * - Edit the .s file to change the 'progbits' type to 'note', for the section
+ *   directive that defines the .note.ABI-tag section.
+ * - Compile the .s file to an object file.
+ *
+ * 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,
-    __MidnightBSD_version
+	int32_t	namesz;
+	int32_t	descsz;
+	int32_t	type;
+	char	name[sizeof(NOTE_MIDNIGHTBSD_VENDOR)];
+	int32_t	desc;
+} abitag __attribute__ ((section (NOTE_SECTION), aligned(4))) __used = {
+	.namesz = sizeof(NOTE_MIDNIGHTBSD_VENDOR),
+	.descsz = sizeof(int32_t),
+	.type = ABI_NOTETYPE,
+	.name = NOTE_MIDNIGHTBSD_VENDOR,
+	.desc = __MidnightBSD_version
 };

Added: trunk/lib/csu/common/ignore_init.c
===================================================================
--- trunk/lib/csu/common/ignore_init.c	                        (rev 0)
+++ trunk/lib/csu/common/ignore_init.c	2018-06-05 22:43:43 UTC (rev 10423)
@@ -0,0 +1,119 @@
+/* $MidnightBSD$ */
+/*-
+ * Copyright 2012 Konstantin Belousov <kib at 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>
+__MBSDID("$MidnightBSD$");
+
+#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_argv(int argc, char *argv[], char **env)
+{
+	const char *s;
+
+	if (environ == NULL)
+		environ = env;
+	if (argc > 0 && argv[0] != NULL) {
+		__progname = argv[0];
+		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_MIDNIGHTBSD_VENDOR)];
+	uint32_t desc;
+} crt_noinit_tag __attribute__ ((section (NOTE_SECTION),
+    aligned(4))) __used = {
+	.namesz = sizeof(NOTE_MIDNIGHTBSD_VENDOR),
+	.descsz = sizeof(uint32_t),
+	.type = CRT_NOINIT_NOTETYPE,
+	.name = NOTE_MIDNIGHTBSD_VENDOR,
+	.desc = 0
+};


Property changes on: trunk/lib/csu/common/ignore_init.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property


More information about the Midnightbsd-cvs mailing list