aboutsummaryrefslogtreecommitdiff
path: root/lib/csu
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2020-06-15 19:38:48 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2020-06-15 19:38:48 +0000
commit99282790b7d01ec3c4072621d46a0d7302517ad4 (patch)
tree2b60e6b6545502b508440321628421a3d4019baa /lib/csu
parentad54157b5e060ae38035f960dcb4dc824e772446 (diff)
downloadsrc-99282790b7d01ec3c4072621d46a0d7302517ad4.tar.gz
src-99282790b7d01ec3c4072621d46a0d7302517ad4.zip
Notes
Diffstat (limited to 'lib/csu')
-rw-r--r--lib/csu/Makefile.inc4
-rw-r--r--lib/csu/aarch64/Makefile36
-rw-r--r--lib/csu/aarch64/crt1_c.c (renamed from lib/csu/aarch64/crt1.c)14
-rw-r--r--lib/csu/aarch64/crt1_s.S47
-rw-r--r--lib/csu/amd64/Makefile37
-rw-r--r--lib/csu/amd64/crt1_c.c (renamed from lib/csu/amd64/crt1.c)1
-rw-r--r--lib/csu/arm/Makefile37
-rw-r--r--lib/csu/arm/crt1_c.c (renamed from lib/csu/arm/crt1.c)35
-rw-r--r--lib/csu/arm/crt1_s.S78
-rw-r--r--lib/csu/common/crtbrand.S59
-rw-r--r--lib/csu/common/crtbrand.c84
-rw-r--r--lib/csu/common/ignore_init.c17
-rw-r--r--lib/csu/common/ignore_init_note.S43
-rw-r--r--lib/csu/i386/Makefile29
-rw-r--r--lib/csu/i386/crt1_c.c1
-rw-r--r--lib/csu/i386/crt1_s.S3
-rw-r--r--lib/csu/mips/Makefile37
-rw-r--r--lib/csu/mips/crt1_c.c (renamed from lib/csu/mips/crt1.c)1
-rw-r--r--lib/csu/powerpc/Makefile37
-rw-r--r--lib/csu/powerpc/crt1_c.c (renamed from lib/csu/powerpc/crt1.c)1
-rw-r--r--lib/csu/powerpc64/Makefile38
-rw-r--r--lib/csu/powerpc64/crt1_c.c (renamed from lib/csu/powerpc64/crt1.c)1
-rw-r--r--lib/csu/riscv/Makefile36
-rw-r--r--lib/csu/riscv/crt1_c.c (renamed from lib/csu/riscv/crt1.c)18
-rw-r--r--lib/csu/riscv/crt1_s.S56
25 files changed, 391 insertions, 359 deletions
diff --git a/lib/csu/Makefile.inc b/lib/csu/Makefile.inc
index c27d44f2a8d9..0870e2950706 100644
--- a/lib/csu/Makefile.inc
+++ b/lib/csu/Makefile.inc
@@ -2,8 +2,6 @@
SSP_CFLAGS=
-SED_FIX_NOTE = -i "" -e '/\.note\.tag/s/progbits/note/'
-
NO_WMISSING_VARIABLE_DECLARATIONS=
.include <src.opts.mk>
@@ -13,6 +11,8 @@ NO_WMISSING_VARIABLE_DECLARATIONS=
OBJS+= crtbegin.o crtbeginS.o crtbeginT.o
OBJS+= crtend.o crtendS.o
+ACFLAGS+= -DLOCORE
+
CFLAGS+= -fno-asynchronous-unwind-tables
CFLAGS+= -fno-omit-frame-pointer
diff --git a/lib/csu/aarch64/Makefile b/lib/csu/aarch64/Makefile
index df1fe6e2343b..61212c0479c0 100644
--- a/lib/csu/aarch64/Makefile
+++ b/lib/csu/aarch64/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_SUPPRESS
@@ -17,31 +17,21 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+crt1.o: crt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
-
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/aarch64/crt1.c b/lib/csu/aarch64/crt1_c.c
index a01897ed59ff..d8c2156ffc21 100644
--- a/lib/csu/aarch64/crt1.c
+++ b/lib/csu/aarch64/crt1_c.c
@@ -35,7 +35,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
#ifdef GCRT
@@ -50,19 +49,6 @@ extern long * _end;
void __start(int, char **, char **, void (*)(void));
/* The entry function. */
-__asm(" .text \n"
-" .align 0 \n"
-" .globl _start \n"
-" _start: \n"
-" mov x3, x2 \n" /* cleanup */
-" add x1, x0, #8 \n" /* load argv */
-" ldr x0, [x0] \n" /* load argc */
-" add x2, x1, x0, lsl #3 \n" /* env is after argv */
-" add x2, x2, #8 \n" /* argv is null terminated */
-" b __start ");
-
-
-/* The entry function. */
void
__start(int argc, char *argv[], char *env[], void (*cleanup)(void))
{
diff --git a/lib/csu/aarch64/crt1_s.S b/lib/csu/aarch64/crt1_s.S
new file mode 100644
index 000000000000..61e11aef6700
--- /dev/null
+++ b/lib/csu/aarch64/crt1_s.S
@@ -0,0 +1,47 @@
+/* LINTLIBRARY */
+/*-
+ * Copyright 1996-1998 John D. Polstra.
+ * Copyright 2014 Andrew Turner.
+ * Copyright 2014-2015 The FreeBSD Foundation.
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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 <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "crtbrand.S"
+#include "ignore_init_note.S"
+
+ENTRY(_start)
+ mov x3, x2 /* cleanup */
+ add x1, x0, #8 /* load argv */
+ ldr x0, [x0] /* load argc */
+ add x2, x1, x0, lsl #3 /* env is after argv */
+ add x2, x2, #8 /* argv is null terminated */
+ b __start
+END(_start)
+
+ .section .note.GNU-stack,"",@progbits
diff --git a/lib/csu/amd64/Makefile b/lib/csu/amd64/Makefile
index 493ad93173b0..9fe13057368f 100644
--- a/lib/csu/amd64/Makefile
+++ b/lib/csu/amd64/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR} -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -fno-omit-frame-pointer -DCRT_IRELOC_RELA
@@ -17,31 +17,22 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o gcrt1_c.o Scrt1_c.o
+CLEANFILES+= crtbrand.o ignore_init_note.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crtbrand.o ignore_init_note.o gcrt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+crt1.o: crt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crtbrand.o ignore_init_note.o crt1_c.o
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
-
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crtbrand.o ignore_init_note.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/amd64/crt1.c b/lib/csu/amd64/crt1_c.c
index 7b9b442a4c0a..9dbd34492023 100644
--- a/lib/csu/amd64/crt1.c
+++ b/lib/csu/amd64/crt1_c.c
@@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
diff --git a/lib/csu/arm/Makefile b/lib/csu/arm/Makefile
index 0ed077e635ad..ed238c69c887 100644
--- a/lib/csu/arm/Makefile
+++ b/lib/csu/arm/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_SUPPRESS
@@ -17,31 +17,24 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+crt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} ${STATIC_CFLAGS} -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} ${STATIC_CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+crt1.o: crt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} ${STATIC_CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} ${STATIC_CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/arm/crt1.c b/lib/csu/arm/crt1_c.c
index 0d61d319f351..9725f173ff78 100644
--- a/lib/csu/arm/crt1.c
+++ b/lib/csu/arm/crt1_c.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
@@ -70,26 +69,6 @@ struct ps_strings *__ps_strings;
void __start(int, char **, char **, struct ps_strings *,
const struct Struct_Obj_Entry *, void (*)(void));
-/* The entry function. */
-__asm(" .text \n"
-" .align 0 \n"
-" .globl _start \n"
-" _start: \n"
-" mov r5, r2 /* cleanup */ \n"
-" mov r4, r1 /* obj_main */ \n"
-" mov r3, r0 /* ps_strings */ \n"
-" /* Get argc, argv, and envp from stack */ \n"
-" ldr r0, [sp, #0x0000] \n"
-" add r1, sp, #0x0004 \n"
-" add r2, r1, r0, lsl #2 \n"
-" add r2, r2, #0x0004 \n"
-" /* Ensure the stack is properly aligned before calling C code. */\n"
-" bic sp, sp, #7 \n"
-" sub sp, sp, #8 \n"
-" str r5, [sp, #4] \n"
-" str r4, [sp, #0] \n"
-"\n"
-" b __start ");
/* ARGSUSED */
void
__start(int argc, char **argv, char **env, struct ps_strings *ps_strings,
@@ -113,20 +92,6 @@ __start(int argc, char **argv, char **env, struct ps_strings *ps_strings,
exit(main(argc, argv, env));
}
-static const struct {
- int32_t namesz;
- int32_t descsz;
- int32_t type;
- char name[sizeof(NOTE_FREEBSD_VENDOR)];
- char desc[sizeof(MACHINE_ARCH)];
-} archtag __attribute__ ((section (NOTE_SECTION), aligned(4))) __used = {
- .namesz = sizeof(NOTE_FREEBSD_VENDOR),
- .descsz = sizeof(MACHINE_ARCH),
- .type = NT_FREEBSD_ARCH_TAG,
- .name = NOTE_FREEBSD_VENDOR,
- .desc = MACHINE_ARCH
-};
-
#ifdef GCRT
__asm__(".text");
__asm__("eprol:");
diff --git a/lib/csu/arm/crt1_s.S b/lib/csu/arm/crt1_s.S
new file mode 100644
index 000000000000..50c59fc21f5a
--- /dev/null
+++ b/lib/csu/arm/crt1_s.S
@@ -0,0 +1,78 @@
+/* LINTLIBRARY */
+/*-
+ * SPDX-License-Identifier: BSD-4-Clause
+ *
+ * Copyright 2001 David E. O'Brien.
+ * All rights reserved.
+ * Copyright 1996-1998 John D. Polstra.
+ * All rights reserved.
+ * Copyright (c) 1997 Jason R. Thorpe.
+ * 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
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the
+ * FreeBSD Project. See https://www.freebsd.org/ for
+ * information about FreeBSD.
+ * This product includes software developed for the
+ * NetBSD Project. See http://www.netbsd.org/ for
+ * information about NetBSD.
+ * 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
+ * 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 <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "crtbrand.S"
+#include "ignore_init_note.S"
+
+ENTRY(_start)
+ mov r5, r2 /* cleanup */
+ mov r4, r1 /* obj_main */
+ mov r3, r0 /* ps_strings */
+ /* Get argc, argv, and envp from stack */
+ ldr r0, [sp, #0x0000]
+ add r1, sp, #0x0004
+ add r2, r1, r0, lsl #2
+ add r2, r2, #0x0004
+ /* Ensure the stack is properly aligned before calling C code. */
+ bic sp, sp, #7
+ sub sp, sp, #8
+ str r5, [sp, #4]
+ str r4, [sp, #0]
+
+ b __start
+END(_start)
+
+ .section .note.tag,"a",%note
+ .p2align 2
+ .4byte 2f-1f
+ .4byte 4f-3f
+ .4byte NT_FREEBSD_ARCH_TAG
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .asciz MACHINE_ARCH
+4:
+
+ .section .note.GNU-stack,"",%progbits
diff --git a/lib/csu/common/crtbrand.S b/lib/csu/common/crtbrand.S
new file mode 100644
index 000000000000..8efe7fb6347b
--- /dev/null
+++ b/lib/csu/common/crtbrand.S
@@ -0,0 +1,59 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright 2000 David E. O'Brien, 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.
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/elf_common.h>
+#include "notes.h"
+
+/*
+ * Special ".note.tag" entry specifying the ABI version. See
+ * http://www.netbsd.org/Documentation/kernel/elf-notes.html
+ * for more information.
+ */
+
+ .section .note.tag,"a",%note
+ .p2align 2
+ .4byte 2f-1f
+ .4byte 4f-3f
+ .4byte NT_FREEBSD_ABI_TAG
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .4byte __FreeBSD_version
+4:
+
+ .section .note.tag,"a",%note
+ .p2align 2
+ .4byte 2f-1f
+ .4byte 4f-3f
+ .4byte NT_FREEBSD_FEATURE_CTL
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .4byte 0
+4:
diff --git a/lib/csu/common/crtbrand.c b/lib/csu/common/crtbrand.c
deleted file mode 100644
index f8fb0024db24..000000000000
--- a/lib/csu/common/crtbrand.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright 2000 David E. O'Brien, 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.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/elf_common.h>
-#include "notes.h"
-
-/*
- * 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(NOTE_FREEBSD_VENDOR)];
- int32_t desc;
-} abitag __attribute__ ((section (NOTE_SECTION), aligned(4))) __used = {
- .namesz = sizeof(NOTE_FREEBSD_VENDOR),
- .descsz = sizeof(int32_t),
- .type = NT_FREEBSD_ABI_TAG,
- .name = NOTE_FREEBSD_VENDOR,
- .desc = __FreeBSD_version
-};
-
-static const struct {
- int32_t namesz;
- int32_t descsz;
- int32_t type;
- char name[sizeof(NOTE_FREEBSD_VENDOR)];
- uint32_t desc[1];
-} crt_feature_ctl __attribute__ ((section (NOTE_SECTION),
- aligned(4))) __used = {
- .namesz = sizeof(NOTE_FREEBSD_VENDOR),
- .descsz = sizeof(uint32_t),
- .type = NT_FREEBSD_FEATURE_CTL,
- .name = NOTE_FREEBSD_VENDOR,
- .desc = { 0 }
-};
diff --git a/lib/csu/common/ignore_init.c b/lib/csu/common/ignore_init.c
index 9bbe55d904fd..2cdb869c4a87 100644
--- a/lib/csu/common/ignore_init.c
+++ b/lib/csu/common/ignore_init.c
@@ -32,8 +32,6 @@ __FBSDID("$FreeBSD$");
#include <sys/elf.h>
#include <sys/elf_common.h>
-#include "notes.h"
-
extern int main(int, char **, char **);
extern void (*__preinit_array_start[])(int, char **, char **) __hidden;
@@ -140,18 +138,3 @@ handle_argv(int argc, char *argv[], char **env)
}
}
}
-
-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 = NT_FREEBSD_NOINIT_TAG,
- .name = NOTE_FREEBSD_VENDOR,
- .desc = 0
-};
diff --git a/lib/csu/common/ignore_init_note.S b/lib/csu/common/ignore_init_note.S
new file mode 100644
index 000000000000..804cefd47155
--- /dev/null
+++ b/lib/csu/common/ignore_init_note.S
@@ -0,0 +1,43 @@
+/*-
+ * SPDX-License-Identifier: BSD-1-Clause
+ *
+ * Copyright 2012 Konstantin Belousov <kib@FreeBSD.org>
+ * Copyright (c) 2018 The FreeBSD Foundation
+ *
+ * Parts of this software was developed by Konstantin Belousov
+ * <kib@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
+ *
+ * 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.
+ *
+ * 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 <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/elf_common.h>
+
+#include "notes.h"
+
+ .section .note.tag,"a",%note
+ .p2align 2
+ .4byte 2f-1f
+ .4byte 4f-3f
+ .4byte NT_FREEBSD_NOINIT_TAG
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .4byte 0
+4:
diff --git a/lib/csu/i386/Makefile b/lib/csu/i386/Makefile
index 4e8117f350bc..2483ca35c285 100644
--- a/lib/csu/i386/Makefile
+++ b/lib/csu/i386/Makefile
@@ -4,7 +4,7 @@
SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= gcrt1.o crt1.o Scrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR} -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_REL
@@ -18,38 +18,19 @@ FILESDIR= ${LIBDIR}
.undef LIBRARIES_ONLY
CLEANFILES= ${OBJS} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o
-CLEANFILES+= crt1_c.s gcrt1_c.s Scrt1_c.s
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1_c.c is not
-# directly compiled to .o files.
-
-gcrt1_c.s: crt1_c.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-gcrt1_c.o: gcrt1_c.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1_c.s
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
gcrt1.o: gcrt1_c.o crt1_s.o
${LD} ${_LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o
-crt1_c.s: crt1_c.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-crt1_c.o: crt1_c.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1_c.s
-
crt1.o: crt1_c.o crt1_s.o
${LD} ${_LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o
${OBJCOPY} --localize-symbol _start1 crt1.o
-Scrt1_c.s: crt1_c.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1_c.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1_c.o: Scrt1_c.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1_c.s
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
Scrt1.o: Scrt1_c.o crt1_s.o
${LD} ${_LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o
diff --git a/lib/csu/i386/crt1_c.c b/lib/csu/i386/crt1_c.c
index b3e6cb330c26..0d82cda6fa1f 100644
--- a/lib/csu/i386/crt1_c.c
+++ b/lib/csu/i386/crt1_c.c
@@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
diff --git a/lib/csu/i386/crt1_s.S b/lib/csu/i386/crt1_s.S
index 1bd9a4283987..e09c2e6b57f1 100644
--- a/lib/csu/i386/crt1_s.S
+++ b/lib/csu/i386/crt1_s.S
@@ -25,6 +25,9 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+#include "crtbrand.S"
+#include "ignore_init_note.S"
+
.text
.align 4
.globl _start
diff --git a/lib/csu/mips/Makefile b/lib/csu/mips/Makefile
index df1fe6e2343b..18434ef75011 100644
--- a/lib/csu/mips/Makefile
+++ b/lib/csu/mips/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_SUPPRESS
@@ -17,31 +17,22 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o gcrt1_c.o Scrt1_c.o
+CLEANFILES+= crtbrand.o ignore_init_note.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crtbrand.o ignore_init_note.o gcrt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+crt1.o: crt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crtbrand.o ignore_init_note.o crt1_c.o
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
-
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crtbrand.o ignore_init_note.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/mips/crt1.c b/lib/csu/mips/crt1_c.c
index 0f7fe1433ed3..b753f7b707bd 100644
--- a/lib/csu/mips/crt1.c
+++ b/lib/csu/mips/crt1_c.c
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile
index 446e0bd1b3e9..0294592f9e6d 100644
--- a/lib/csu/powerpc/Makefile
+++ b/lib/csu/powerpc/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S crtsavres.S
+SRCS= crti.S crtn.S crtsavres.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_SUPPRESS
@@ -17,31 +17,22 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o gcrt1_c.o Scrt1_c.o
+CLEANFILES+= crtbrand.o ignore_init_note.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crtbrand.o ignore_init_note.o gcrt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+crt1.o: crt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crtbrand.o ignore_init_note.o crt1_c.o
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
-
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crtbrand.o ignore_init_note.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/powerpc/crt1.c b/lib/csu/powerpc/crt1_c.c
index 43d7a65aea9e..8ad291bb4f4d 100644
--- a/lib/csu/powerpc/crt1.c
+++ b/lib/csu/powerpc/crt1_c.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
diff --git a/lib/csu/powerpc64/Makefile b/lib/csu/powerpc64/Makefile
index e452a567d966..e69343b128b5 100644
--- a/lib/csu/powerpc64/Makefile
+++ b/lib/csu/powerpc64/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= crtsavres.o Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o crtsavres.o gcrt1.o
CFLAGS+= -I${.CURDIR} -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include \
-mlongcall -DCRT_IRELOC_RELA
@@ -17,35 +17,27 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s crtsavres.S gcrt1.s Scrt1.s
-
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
-
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+CLEANFILES= ${OBJS} crt1_c.o gcrt1_c.o Scrt1_c.o
+CLEANFILES+= crtbrand.o ignore_init_note.o
+CLEANFILES+= crtsavres.S
# On powerpc64 crtsavres is an empty file
crtsavres.S:
touch ${.TARGET}
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crtbrand.o ignore_init_note.o gcrt1_c.o
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
+crt1.o: crt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crtbrand.o ignore_init_note.o crt1_c.o
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crtbrand.o ignore_init_note.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crtbrand.o ignore_init_note.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/powerpc64/crt1.c b/lib/csu/powerpc64/crt1_c.c
index 1d1d170f6e06..c9115be75fba 100644
--- a/lib/csu/powerpc64/crt1.c
+++ b/lib/csu/powerpc64/crt1_c.c
@@ -52,7 +52,6 @@ static uint32_t cpu_features;
static uint32_t cpu_features2;
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
diff --git a/lib/csu/riscv/Makefile b/lib/csu/riscv/Makefile
index df1fe6e2343b..61212c0479c0 100644
--- a/lib/csu/riscv/Makefile
+++ b/lib/csu/riscv/Makefile
@@ -2,9 +2,9 @@
.PATH: ${.CURDIR:H}/common
-SRCS= crt1.c crti.S crtn.S
+SRCS= crti.S crtn.S
OBJS= ${SRCS:N*.h:R:S/$/.o/g}
-OBJS+= Scrt1.o gcrt1.o
+OBJS+= Scrt1.o crt1.o gcrt1.o
CFLAGS+= -I${.CURDIR:H}/common \
-I${SRCTOP}/lib/libc/include
CFLAGS+= -DCRT_IRELOC_SUPPRESS
@@ -17,31 +17,21 @@ FILESDIR= ${LIBDIR}
# These FILES qualify as libraries for the purpose of LIBRARIES_ONLY.
.undef LIBRARIES_ONLY
-CLEANFILES= ${OBJS}
-CLEANFILES+= crt1.s gcrt1.s Scrt1.s
+CLEANFILES= ${OBJS} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o
-# See the comment in lib/csu/common/crtbrand.c for the reason crt1.c is not
-# directly compiled to .o files.
+gcrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-crt1.s: crt1.c
- ${CC} ${CFLAGS} -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+gcrt1.o: gcrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o
-crt1.o: crt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} crt1.s
+crt1.o: crt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o
-gcrt1.s: crt1.c
- ${CC} ${CFLAGS} -DGCRT -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
+Scrt1_c.o: crt1_c.c
+ ${CC} ${CFLAGS} -fPIC -DPIC -c -o ${.TARGET} ${.CURDIR}/crt1_c.c
-gcrt1.o: gcrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} gcrt1.s
-
-Scrt1.s: crt1.c
- ${CC} ${CFLAGS} -fPIC -DPIC -S -o ${.TARGET} ${.CURDIR}/crt1.c
- sed ${SED_FIX_NOTE} ${.TARGET}
-
-Scrt1.o: Scrt1.s
- ${CC} ${CFLAGS:N-g} ${ACFLAGS} -c -o ${.TARGET} Scrt1.s
+Scrt1.o: Scrt1_c.o crt1_s.o
+ ${LD} ${_LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/riscv/crt1.c b/lib/csu/riscv/crt1_c.c
index 0905e84e7b58..9291d6d200df 100644
--- a/lib/csu/riscv/crt1.c
+++ b/lib/csu/riscv/crt1_c.c
@@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
@@ -53,23 +52,6 @@ extern int etext;
void __start(int argc, char **argv, char **env, void (*cleanup)(void));
-/* The entry function. */
-__asm(" .text \n"
-" .align 0 \n"
-" .globl _start \n"
-" _start: \n"
-" mv a3, a2 \n" /* cleanup */
-" addi a1, a0, 8 \n" /* get argv */
-" ld a0, 0(a0) \n" /* load argc */
-" slli t0, a0, 3 \n" /* mult by arg size */
-" add a2, a1, t0 \n" /* env is after argv */
-" addi a2, a2, 8 \n" /* argv is null terminated */
-" .option push \n"
-" .option norelax \n"
-" lla gp, __global_pointer$\n"
-" .option pop \n"
-" call __start");
-
void
__start(int argc, char **argv, char **env, void (*cleanup)(void))
{
diff --git a/lib/csu/riscv/crt1_s.S b/lib/csu/riscv/crt1_s.S
new file mode 100644
index 000000000000..409e796593e7
--- /dev/null
+++ b/lib/csu/riscv/crt1_s.S
@@ -0,0 +1,56 @@
+/* LINTLIBRARY */
+/*-
+ * Copyright 1996-1998 John D. Polstra.
+ * Copyright (c) 2015-2017 Ruslan Bukin <br@bsdpad.com>
+ * All rights reserved.
+ *
+ * Portions of this software were developed by SRI International and the
+ * University of Cambridge Computer Laboratory under DARPA/AFRL contract
+ * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
+ *
+ * Portions of this software were developed by the University of Cambridge
+ * Computer Laboratory as part of the CTSRD Project, with support from the
+ * UK Higher Education Innovation Fund (HEIF).
+ *
+ * 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 <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "crtbrand.S"
+#include "ignore_init_note.S"
+
+ENTRY(_start)
+ mv a3, a2 # cleanup
+ addi a1, a0, 8 # get argv
+ ld a0, 0(a0) # load argc
+ slli t0, a0, 3 # mult by arg size
+ add a2, a1, t0 # env is after argv
+ addi a2, a2, 8 # argv is null terminated
+ .option push
+ .option norelax
+ lla gp, __global_pointer$
+ .option pop
+ call __start
+END(_start)
+
+ .section .note.GNU-stack,"",%progbits