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
This commit is contained in:
parent
ad54157b5e
commit
99282790b7
@ -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
|
||||
|
||||
|
@ -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>
|
||||
|
@ -35,7 +35,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdlib.h>
|
||||
|
||||
#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))
|
47
lib/csu/aarch64/crt1_s.S
Normal file
47
lib/csu/aarch64/crt1_s.S
Normal file
@ -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
|
@ -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>
|
||||
|
@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "libc_private.h"
|
||||
#include "crtbrand.c"
|
||||
#include "ignore_init.c"
|
||||
|
||||
typedef void (*fptr)(void);
|
@ -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>
|
||||
|
@ -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:");
|
78
lib/csu/arm/crt1_s.S
Normal file
78
lib/csu/arm/crt1_s.S
Normal file
@ -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
|
59
lib/csu/common/crtbrand.S
Normal file
59
lib/csu/common/crtbrand.S
Normal file
@ -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:
|
@ -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 }
|
||||
};
|
@ -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
|
||||
};
|
||||
|
43
lib/csu/common/ignore_init_note.S
Normal file
43
lib/csu/common/ignore_init_note.S
Normal file
@ -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:
|
@ -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
|
||||
|
@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "libc_private.h"
|
||||
#include "crtbrand.c"
|
||||
#include "ignore_init.c"
|
||||
|
||||
typedef void (*fptr)(void);
|
||||
|
@ -25,6 +25,9 @@
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "crtbrand.S"
|
||||
#include "ignore_init_note.S"
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl _start
|
||||
|
@ -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>
|
||||
|
@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "libc_private.h"
|
||||
#include "crtbrand.c"
|
||||
#include "ignore_init.c"
|
||||
|
||||
struct Struct_Obj_Entry;
|
@ -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>
|
||||
|
@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "libc_private.h"
|
||||
#include "crtbrand.c"
|
||||
#include "ignore_init.c"
|
||||
|
||||
struct Struct_Obj_Entry;
|
@ -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>
|
||||
|
@ -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;
|
@ -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>
|
||||
|
@ -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))
|
||||
{
|
56
lib/csu/riscv/crt1_s.S
Normal file
56
lib/csu/riscv/crt1_s.S
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user