Date: Mon, 15 Jun 2020 19:38:48 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r362203 - in head/lib/csu: . aarch64 amd64 arm common i386 mips powerpc powerpc64 riscv Message-ID: <202006151938.05FJcmoe030335@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Mon Jun 15 19:38:48 2020 New Revision: 362203 URL: https://svnweb.freebsd.org/changeset/base/362203 Log: 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 Added: head/lib/csu/aarch64/crt1_c.c - copied, changed from r362202, head/lib/csu/aarch64/crt1.c head/lib/csu/aarch64/crt1_s.S - copied, changed from r362201, head/lib/csu/aarch64/crt1.c head/lib/csu/amd64/crt1_c.c - copied, changed from r362202, head/lib/csu/amd64/crt1.c head/lib/csu/arm/crt1_c.c - copied, changed from r362202, head/lib/csu/arm/crt1.c head/lib/csu/arm/crt1_s.S - copied, changed from r362201, head/lib/csu/arm/crt1.c head/lib/csu/common/crtbrand.S - copied, changed from r362202, head/lib/csu/common/crtbrand.c head/lib/csu/common/ignore_init_note.S - copied, changed from r362201, head/lib/csu/common/ignore_init.c head/lib/csu/mips/crt1_c.c - copied, changed from r362202, head/lib/csu/mips/crt1.c head/lib/csu/powerpc/crt1_c.c - copied, changed from r362202, head/lib/csu/powerpc/crt1.c head/lib/csu/powerpc64/crt1_c.c - copied, changed from r362202, head/lib/csu/powerpc64/crt1.c head/lib/csu/riscv/crt1_c.c - copied, changed from r362202, head/lib/csu/riscv/crt1.c head/lib/csu/riscv/crt1_s.S - copied, changed from r362201, head/lib/csu/riscv/crt1.c Deleted: head/lib/csu/aarch64/crt1.c head/lib/csu/amd64/crt1.c head/lib/csu/arm/crt1.c head/lib/csu/common/crtbrand.c head/lib/csu/mips/crt1.c head/lib/csu/powerpc/crt1.c head/lib/csu/powerpc64/crt1.c head/lib/csu/riscv/crt1.c Modified: head/lib/csu/Makefile.inc head/lib/csu/aarch64/Makefile head/lib/csu/amd64/Makefile head/lib/csu/arm/Makefile head/lib/csu/common/ignore_init.c head/lib/csu/i386/Makefile head/lib/csu/i386/crt1_c.c head/lib/csu/i386/crt1_s.S head/lib/csu/mips/Makefile head/lib/csu/powerpc/Makefile head/lib/csu/powerpc64/Makefile head/lib/csu/riscv/Makefile Modified: head/lib/csu/Makefile.inc ============================================================================== --- head/lib/csu/Makefile.inc Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/Makefile.inc Mon Jun 15 19:38:48 2020 (r362203) @@ -2,8 +2,6 @@ SSP_CFLAGS= -SED_FIX_NOTE = -i "" -e '/\.note\.tag/s/progbits/note/' - NO_WMISSING_VARIABLE_DECLARATIONS= .include <src.opts.mk> @@ -12,6 +10,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 Modified: head/lib/csu/aarch64/Makefile ============================================================================== --- head/lib/csu/aarch64/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/aarch64/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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> Copied and modified: head/lib/csu/aarch64/crt1_c.c (from r362202, head/lib/csu/aarch64/crt1.c) ============================================================================== --- head/lib/csu/aarch64/crt1.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/aarch64/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -35,7 +35,6 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" #ifdef GCRT @@ -48,19 +47,6 @@ extern int etext; 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 Copied and modified: head/lib/csu/aarch64/crt1_s.S (from r362201, head/lib/csu/aarch64/crt1.c) ============================================================================== --- head/lib/csu/aarch64/crt1.c Mon Jun 15 16:35:27 2020 (r362201, copy source) +++ head/lib/csu/aarch64/crt1_s.S Mon Jun 15 19:38:48 2020 (r362203) @@ -29,57 +29,19 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> +#include <machine/asm.h> __FBSDID("$FreeBSD$"); -#include <stdlib.h> +#include "crtbrand.S" +#include "ignore_init_note.S" -#include "libc_private.h" -#include "crtbrand.c" -#include "ignore_init.c" +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) -#ifdef GCRT -extern void _mcleanup(void); -extern void monstartup(void *, void *); -extern int eprol; -extern int etext; -#endif - -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)) -{ - - handle_argv(argc, argv, env); - - if (&_DYNAMIC != NULL) - atexit(cleanup); - else - _init_tls(); - -#ifdef GCRT - atexit(_mcleanup); - monstartup(&eprol, &etext); -__asm__("eprol:"); -#endif - - handle_static_init(argc, argv, env); - exit(main(argc, argv, env)); -} + .section .note.GNU-stack,"",@progbits Modified: head/lib/csu/amd64/Makefile ============================================================================== --- head/lib/csu/amd64/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/amd64/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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> Copied and modified: head/lib/csu/amd64/crt1_c.c (from r362202, head/lib/csu/amd64/crt1.c) ============================================================================== --- head/lib/csu/amd64/crt1.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/amd64/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" typedef void (*fptr)(void); Modified: head/lib/csu/arm/Makefile ============================================================================== --- head/lib/csu/arm/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/arm/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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> Copied and modified: head/lib/csu/arm/crt1_c.c (from r362202, head/lib/csu/arm/crt1.c) ============================================================================== --- head/lib/csu/arm/crt1.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/arm/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -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, @@ -112,20 +91,6 @@ __start(int argc, char **argv, char **env, struct ps_s handle_static_init(argc, argv, env); 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"); Copied and modified: head/lib/csu/arm/crt1_s.S (from r362201, head/lib/csu/arm/crt1.c) ============================================================================== --- head/lib/csu/arm/crt1.c Mon Jun 15 16:35:27 2020 (r362201, copy source) +++ head/lib/csu/arm/crt1_s.S Mon Jun 15 19:38:48 2020 (r362203) @@ -41,94 +41,38 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> +#include <machine/asm.h> __FBSDID("$FreeBSD$"); -#include <sys/param.h> -#include <sys/elf_common.h> -#include <stdlib.h> +#include "crtbrand.S" +#include "ignore_init_note.S" -#include "libc_private.h" -#include "crtbrand.c" -#include "ignore_init.c" +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] -struct Struct_Obj_Entry; -struct ps_strings; + b __start +END(_start) -extern void _start(int, char **, char **, const struct Struct_Obj_Entry *, - void (*)(void), struct ps_strings *); + .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: -#ifdef GCRT -extern void _mcleanup(void); -extern void monstartup(void *, void *); -extern int eprol; -extern int etext; -#endif - -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, - const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void)) -{ - - handle_argv(argc, argv, env); - - if (ps_strings != (struct ps_strings *)0) - __ps_strings = ps_strings; - - if (&_DYNAMIC != NULL) - atexit(cleanup); - else - _init_tls(); -#ifdef GCRT - atexit(_mcleanup); - monstartup(&eprol, &etext); -#endif - handle_static_init(argc, argv, env); - 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:"); -__asm__(".previous"); -#endif + .section .note.GNU-stack,"",%progbits Copied and modified: head/lib/csu/common/crtbrand.S (from r362202, head/lib/csu/common/crtbrand.c) ============================================================================== --- head/lib/csu/common/crtbrand.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/common/crtbrand.S Mon Jun 15 19:38:48 2020 (r362203) @@ -25,7 +25,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> +#include <machine/asm.h> __FBSDID("$FreeBSD$"); #include <sys/param.h> @@ -33,52 +33,27 @@ __FBSDID("$FreeBSD$"); #include "notes.h" /* - * Special ".note" entry specifying the ABI version. See + * Special ".note.tag" 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 } -}; + .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: Modified: head/lib/csu/common/ignore_init.c ============================================================================== --- head/lib/csu/common/ignore_init.c Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/common/ignore_init.c Mon Jun 15 19:38:48 2020 (r362203) @@ -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 -}; Copied and modified: head/lib/csu/common/ignore_init_note.S (from r362201, head/lib/csu/common/ignore_init.c) ============================================================================== --- head/lib/csu/common/ignore_init.c Mon Jun 15 16:35:27 2020 (r362201, copy source) +++ head/lib/csu/common/ignore_init_note.S Mon Jun 15 19:38:48 2020 (r362203) @@ -25,133 +25,19 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <sys/cdefs.h> +#include <machine/asm.h> __FBSDID("$FreeBSD$"); -#include <sys/param.h> -#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; -extern void (*__preinit_array_end[])(int, char **, char **) __hidden; -extern void (*__init_array_start[])(int, char **, char **) __hidden; -extern void (*__init_array_end[])(int, char **, char **) __hidden; -extern void (*__fini_array_start[])(void) __hidden; -extern void (*__fini_array_end[])(void) __hidden; -extern void _fini(void) __hidden; -extern void _init(void) __hidden; - -extern int _DYNAMIC; -#pragma weak _DYNAMIC - -#if defined(CRT_IRELOC_RELA) -extern const Elf_Rela __rela_iplt_start[] __weak_symbol __hidden; -extern const Elf_Rela __rela_iplt_end[] __weak_symbol __hidden; - -#include "reloc.c" - -static void -process_irelocs(void) -{ - const Elf_Rela *r; - - for (r = &__rela_iplt_start[0]; r < &__rela_iplt_end[0]; r++) - crt1_handle_rela(r); -} -#elif defined(CRT_IRELOC_REL) -extern const Elf_Rel __rel_iplt_start[] __weak_symbol __hidden; -extern const Elf_Rel __rel_iplt_end[] __weak_symbol __hidden; - -#include "reloc.c" - -static void -process_irelocs(void) -{ - const Elf_Rel *r; - - for (r = &__rel_iplt_start[0]; r < &__rel_iplt_end[0]; r++) - crt1_handle_rel(r); -} -#elif defined(CRT_IRELOC_SUPPRESS) -#else -#error "Define platform reloc type" -#endif - -char **environ; -const char *__progname = ""; - -static void -finalizer(void) -{ - void (*fn)(void); - size_t array_size, n; - - array_size = __fini_array_end - __fini_array_start; - for (n = array_size; n > 0; n--) { - fn = __fini_array_start[n - 1]; - if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1) - (fn)(); - } - _fini(); -} - -static inline void -handle_static_init(int argc, char **argv, char **env) -{ - void (*fn)(int, char **, char **); - size_t array_size, n; - - if (&_DYNAMIC != NULL) - return; - - atexit(finalizer); - - array_size = __preinit_array_end - __preinit_array_start; - for (n = 0; n < array_size; n++) { - fn = __preinit_array_start[n]; - if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1) - fn(argc, argv, env); - } - _init(); - array_size = __init_array_end - __init_array_start; - for (n = 0; n < array_size; n++) { - fn = __init_array_start[n]; - if ((uintptr_t)fn != 0 && (uintptr_t)fn != 1) - fn(argc, argv, env); - } -} - -static inline void -handle_argv(int argc, char *argv[], char **env) -{ - const char *s; - - if (environ == NULL) - environ = env; - if (argc > 0 && argv[0] != NULL) { - __progname = argv[0]; - for (s = __progname; *s != '\0'; s++) { - if (*s == '/') - __progname = s + 1; - } - } -} - -static const struct { - int32_t namesz; - int32_t descsz; - int32_t type; - char name[sizeof(NOTE_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 -}; + .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: Modified: head/lib/csu/i386/Makefile ============================================================================== --- head/lib/csu/i386/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/i386/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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.o: crt1_c.c + ${CC} ${CFLAGS} -DGCRT -c -o ${.TARGET} ${.CURDIR}/crt1_c.c -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.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 Modified: head/lib/csu/i386/crt1_c.c ============================================================================== --- head/lib/csu/i386/crt1_c.c Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/i386/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" typedef void (*fptr)(void); Modified: head/lib/csu/i386/crt1_s.S ============================================================================== --- head/lib/csu/i386/crt1_s.S Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/i386/crt1_s.S Mon Jun 15 19:38:48 2020 (r362203) @@ -25,6 +25,9 @@ #include <machine/asm.h> __FBSDID("$FreeBSD$"); +#include "crtbrand.S" +#include "ignore_init_note.S" + .text .align 4 .globl _start Modified: head/lib/csu/mips/Makefile ============================================================================== --- head/lib/csu/mips/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/mips/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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> Copied and modified: head/lib/csu/mips/crt1_c.c (from r362202, head/lib/csu/mips/crt1.c) ============================================================================== --- head/lib/csu/mips/crt1.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/mips/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" struct Struct_Obj_Entry; Modified: head/lib/csu/powerpc/Makefile ============================================================================== --- head/lib/csu/powerpc/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/powerpc/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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> Copied and modified: head/lib/csu/powerpc/crt1_c.c (from r362202, head/lib/csu/powerpc/crt1.c) ============================================================================== --- head/lib/csu/powerpc/crt1.c Mon Jun 15 18:57:43 2020 (r362202, copy source) +++ head/lib/csu/powerpc/crt1_c.c Mon Jun 15 19:38:48 2020 (r362203) @@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "libc_private.h" -#include "crtbrand.c" #include "ignore_init.c" struct Struct_Obj_Entry; Modified: head/lib/csu/powerpc64/Makefile ============================================================================== --- head/lib/csu/powerpc64/Makefile Mon Jun 15 18:57:43 2020 (r362202) +++ head/lib/csu/powerpc64/Makefile Mon Jun 15 19:38:48 2020 (r362203) @@ -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 +CLEANFILES= ${OBJS} crt1_c.o gcrt1_c.o Scrt1_c.o +CLEANFILES+= crtbrand.o ignore_init_note.o +CLEANFILES+= crtsavres.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} - # 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 *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202006151938.05FJcmoe030335>