From 99282790b7d01ec3c4072621d46a0d7302517ad4 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 15 Jun 2020 19:38:48 +0000 Subject: [PATCH] Remove the sed hack for ABI tag notes. The ELF notes compiled in C were placed in a section with the wrong type (SHT_PROGBITS instead of SHT_NOTE). Previously, sed was used on the generated assembly to rewrite the section type. Instead, write the notes in assembly which permits setting the correct section type directly. While here, move inline assembly entry points out of C and into assembly for aarch64, arm, and riscv. Reviewed by: kib Tested on: amd64 (cirrus-ci), riscv64 Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D25211 --- lib/csu/Makefile.inc | 4 +- lib/csu/aarch64/Makefile | 36 ++++------- lib/csu/aarch64/{crt1.c => crt1_c.c} | 14 ----- lib/csu/aarch64/crt1_s.S | 47 ++++++++++++++ lib/csu/amd64/Makefile | 37 +++++------- lib/csu/amd64/{crt1.c => crt1_c.c} | 1 - lib/csu/arm/Makefile | 37 +++++------- lib/csu/arm/{crt1.c => crt1_c.c} | 35 ----------- lib/csu/arm/crt1_s.S | 78 ++++++++++++++++++++++++ lib/csu/common/crtbrand.S | 59 ++++++++++++++++++ lib/csu/common/crtbrand.c | 84 -------------------------- lib/csu/common/ignore_init.c | 17 ------ lib/csu/common/ignore_init_note.S | 43 +++++++++++++ lib/csu/i386/Makefile | 29 ++------- lib/csu/i386/crt1_c.c | 1 - lib/csu/i386/crt1_s.S | 3 + lib/csu/mips/Makefile | 37 +++++------- lib/csu/mips/{crt1.c => crt1_c.c} | 1 - lib/csu/powerpc/Makefile | 37 +++++------- lib/csu/powerpc/{crt1.c => crt1_c.c} | 1 - lib/csu/powerpc64/Makefile | 38 +++++------- lib/csu/powerpc64/{crt1.c => crt1_c.c} | 1 - lib/csu/riscv/Makefile | 36 ++++------- lib/csu/riscv/{crt1.c => crt1_c.c} | 18 ------ lib/csu/riscv/crt1_s.S | 56 +++++++++++++++++ 25 files changed, 391 insertions(+), 359 deletions(-) rename lib/csu/aarch64/{crt1.c => crt1_c.c} (86%) create mode 100644 lib/csu/aarch64/crt1_s.S rename lib/csu/amd64/{crt1.c => crt1_c.c} (98%) rename lib/csu/arm/{crt1.c => crt1_c.c} (77%) create mode 100644 lib/csu/arm/crt1_s.S create mode 100644 lib/csu/common/crtbrand.S delete mode 100644 lib/csu/common/crtbrand.c create mode 100644 lib/csu/common/ignore_init_note.S rename lib/csu/mips/{crt1.c => crt1_c.c} (99%) rename lib/csu/powerpc/{crt1.c => crt1_c.c} (99%) rename lib/csu/powerpc64/{crt1.c => crt1_c.c} (99%) rename lib/csu/riscv/{crt1.c => crt1_c.c} (84%) create mode 100644 lib/csu/riscv/crt1_s.S 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 @@ -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 diff --git a/lib/csu/aarch64/crt1.c b/lib/csu/aarch64/crt1_c.c similarity index 86% rename from lib/csu/aarch64/crt1.c rename to 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 #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" #ifdef GCRT @@ -49,19 +48,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 +__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 diff --git a/lib/csu/amd64/crt1.c b/lib/csu/amd64/crt1_c.c similarity index 98% rename from lib/csu/amd64/crt1.c rename to 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 #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 diff --git a/lib/csu/arm/crt1.c b/lib/csu/arm/crt1_c.c similarity index 77% rename from lib/csu/arm/crt1.c rename to 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 #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 +__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 +__FBSDID("$FreeBSD$"); + +#include +#include +#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 -__FBSDID("$FreeBSD$"); - -#include -#include -#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 #include -#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 + * Copyright (c) 2018 The FreeBSD Foundation + * + * Parts of this software was developed by Konstantin Belousov + * 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 +__FBSDID("$FreeBSD$"); + +#include + +#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 #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 __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 diff --git a/lib/csu/mips/crt1.c b/lib/csu/mips/crt1_c.c similarity index 99% rename from lib/csu/mips/crt1.c rename to 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 #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 diff --git a/lib/csu/powerpc/crt1.c b/lib/csu/powerpc/crt1_c.c similarity index 99% rename from lib/csu/powerpc/crt1.c rename to 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 #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 diff --git a/lib/csu/powerpc64/crt1.c b/lib/csu/powerpc64/crt1_c.c similarity index 99% rename from lib/csu/powerpc64/crt1.c rename to 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 diff --git a/lib/csu/riscv/crt1.c b/lib/csu/riscv/crt1_c.c similarity index 84% rename from lib/csu/riscv/crt1.c rename to 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 #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 + * 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 +__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