Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154244680
D25211.id73005.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
31 KB
Referenced Files
None
Subscribers
None
D25211.id73005.diff
View Options
Index: lib/csu/Makefile.inc
===================================================================
--- lib/csu/Makefile.inc
+++ lib/csu/Makefile.inc
@@ -2,8 +2,6 @@
SSP_CFLAGS=
-SED_FIX_NOTE = -i "" -e '/\.note\.tag/s/progbits/note/'
-
NO_WMISSING_VARIABLE_DECLARATIONS=
.include <src.opts.mk>
@@ -13,6 +11,8 @@
OBJS+= crtbegin.o crtbeginS.o crtbeginT.o
OBJS+= crtend.o crtendS.o
+ACFLAGS+= -DLOCORE
+
CFLAGS+= -fno-asynchronous-unwind-tables
CFLAGS+= -fno-omit-frame-pointer
Index: lib/csu/aarch64/Makefile
===================================================================
--- lib/csu/aarch64/Makefile
+++ 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 @@
# 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>
Index: lib/csu/aarch64/crt1_c.c
===================================================================
--- lib/csu/aarch64/crt1_c.c
+++ lib/csu/aarch64/crt1_c.c
@@ -35,7 +35,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
#ifdef GCRT
@@ -49,19 +48,6 @@
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))
Index: lib/csu/aarch64/crt1_s.S
===================================================================
--- lib/csu/aarch64/crt1_s.S
+++ lib/csu/aarch64/crt1_s.S
@@ -1,8 +1,13 @@
/* 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:
@@ -22,55 +27,21 @@
* 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.
- *
- * $FreeBSD$
*/
-#include <sys/cdefs.h>
+#include <machine/asm.h>
__FBSDID("$FreeBSD$");
-#include <stdlib.h>
-
-#include "libc_private.h"
-#include "crtbrand.c"
-#include "ignore_init.c"
-
-typedef void (*fptr)(void);
-
-extern void _start(char *, ...);
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
-
-void _start1(fptr, int, char *[]) __dead2;
-
-/* The entry function, C part. */
-void
-_start1(fptr cleanup, int argc, char *argv[])
-{
- char **env;
-
- env = argv + argc + 1;
- handle_argv(argc, argv, env);
- if (&_DYNAMIC != NULL) {
- atexit(cleanup);
- } else {
- process_irelocs();
- _init_tls();
- }
-
-#ifdef GCRT
- atexit(_mcleanup);
- monstartup(&eprol, &etext);
-__asm__("eprol:");
-#endif
-
- handle_static_init(argc, argv, env);
- exit(main(argc, argv, env));
-}
-
-__asm(".hidden _start1");
+#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
Index: lib/csu/amd64/Makefile
===================================================================
--- lib/csu/amd64/Makefile
+++ 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 @@
# 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>
Index: lib/csu/amd64/crt1_c.c
===================================================================
--- lib/csu/amd64/crt1_c.c
+++ lib/csu/amd64/crt1_c.c
@@ -32,7 +32,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
Index: lib/csu/arm/Makefile
===================================================================
--- lib/csu/arm/Makefile
+++ 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 @@
# 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>
Index: lib/csu/arm/crt1_c.c
===================================================================
--- lib/csu/arm/crt1_c.c
+++ lib/csu/arm/crt1_c.c
@@ -49,7 +49,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
@@ -70,26 +69,6 @@
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,
Index: lib/csu/arm/crt1_s.S
===================================================================
--- lib/csu/arm/crt1_s.S
+++ lib/csu/arm/crt1_s.S
@@ -41,70 +41,28 @@
* 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 "libc_private.h"
-#include "crtbrand.c"
-#include "ignore_init.c"
-
-struct Struct_Obj_Entry;
-struct ps_strings;
-
-#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 **, const struct Struct_Obj_Entry *,
- void (*)(void), struct ps_strings *);
-
-/* The entry function. */
-/*
- * First 5 arguments are specified by the PowerPC SVR4 ABI.
- * The last argument, ps_strings, is a BSD extension.
- */
-/* ARGSUSED */
-void
-_start(int argc, char **argv, char **env,
- const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void),
- struct ps_strings *ps_strings)
-{
-
-
- 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));
-}
-
-#ifdef GCRT
-__asm__(".text");
-__asm__("eprol:");
-__asm__(".previous");
-#endif
-
-#ifndef PIC
-__asm__(".text\n"
- "\t.global _GLOBAL_OFFSET_TABLE_\n"
- "\t.reloc 0, R_PPC_NONE, _GLOBAL_OFFSET_TABLE_");
-#endif
+#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.GNU-stack,"",%progbits
Index: lib/csu/common/crtbrand.S
===================================================================
--- lib/csu/common/crtbrand.S
+++ lib/csu/common/crtbrand.S
@@ -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>
@@ -36,49 +36,24 @@
* 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 }
-};
+ .section .note.tag,"a",@note
+ .p2align 2
+ .word 2f-1f
+ .word 4f-3f
+ .word NT_FREEBSD_ABI_TAG
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .word __FreeBSD_version
+4:
+
+ .section .note.tag,"a",@note
+ .p2align 2
+ .word 2f-1f
+ .word 4f-3f
+ .word NT_FREEBSD_FEATURE_CTL
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .word 0
+4:
Index: lib/csu/common/ignore_init.c
===================================================================
--- lib/csu/common/ignore_init.c
+++ lib/csu/common/ignore_init.c
@@ -32,8 +32,6 @@
#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 @@
}
}
}
-
-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
-};
Index: lib/csu/common/ignore_init_note.S
===================================================================
--- lib/csu/common/ignore_init_note.S
+++ lib/csu/common/ignore_init_note.S
@@ -1,6 +1,11 @@
/*-
- * Copyright 2009 Konstantin Belousov.
- * All rights reserved.
+ * 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
@@ -18,34 +23,21 @@
* 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.
- *
- * $FreeBSD$
*/
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
- .text
- .align 4
- .globl _start
- .type _start, @function
-_start:
- .cfi_startproc
- xorl %ebp,%ebp
- pushl %ebp
- .cfi_def_cfa_offset 4
- movl %esp,%ebp
- .cfi_offset %ebp,-8
- .cfi_def_cfa_register %ebp
- andl $0xfffffff0,%esp # align stack
- leal 8(%ebp),%eax
- subl $4,%esp
- pushl %eax # argv
- pushl 4(%ebp) # argc
- pushl %edx # rtld cleanup
- call _start1
- int3
- .cfi_endproc
- .size _start, . - _start
+#include <sys/elf_common.h>
- .section .note.GNU-stack,"",%progbits
+#include "notes.h"
+
+ .section .note.tag,"a",@note
+ .p2align 2
+ .word 2f-1f
+ .word 4f-3f
+ .word NT_FREEBSD_NOINIT_TAG
+1: .asciz NOTE_FREEBSD_VENDOR
+2: .p2align 2
+3: .word 0
+4:
Index: lib/csu/i386/Makefile
===================================================================
--- lib/csu/i386/Makefile
+++ 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 @@
.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
Index: lib/csu/i386/crt1_c.c
===================================================================
--- lib/csu/i386/crt1_c.c
+++ lib/csu/i386/crt1_c.c
@@ -32,7 +32,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
Index: lib/csu/i386/crt1_s.S
===================================================================
--- lib/csu/i386/crt1_s.S
+++ lib/csu/i386/crt1_s.S
@@ -25,6 +25,9 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+#include "crtbrand.S"
+#include "ignore_init_note.S"
+
.text
.align 4
.globl _start
Index: lib/csu/mips/Makefile
===================================================================
--- lib/csu/mips/Makefile
+++ 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 @@
# 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>
Index: lib/csu/mips/crt1_c.c
===================================================================
--- lib/csu/mips/crt1_c.c
+++ lib/csu/mips/crt1_c.c
@@ -40,7 +40,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
Index: lib/csu/powerpc/Makefile
===================================================================
--- lib/csu/powerpc/Makefile
+++ 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 @@
# 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>
Index: lib/csu/powerpc/crt1_c.c
===================================================================
--- lib/csu/powerpc/crt1_c.c
+++ lib/csu/powerpc/crt1_c.c
@@ -47,7 +47,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
Index: lib/csu/powerpc64/Makefile
===================================================================
--- lib/csu/powerpc64/Makefile
+++ 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 @@
# 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>
Index: lib/csu/powerpc64/crt1_c.c
===================================================================
--- lib/csu/powerpc64/crt1_c.c
+++ lib/csu/powerpc64/crt1_c.c
@@ -52,7 +52,6 @@
static uint32_t cpu_features2;
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
struct Struct_Obj_Entry;
Index: lib/csu/riscv/Makefile
===================================================================
--- lib/csu/riscv/Makefile
+++ 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 @@
# 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>
Index: lib/csu/riscv/crt1_c.c
===================================================================
--- lib/csu/riscv/crt1_c.c
+++ lib/csu/riscv/crt1_c.c
@@ -39,7 +39,6 @@
#include <stdlib.h>
#include "libc_private.h"
-#include "crtbrand.c"
#include "ignore_init.c"
typedef void (*fptr)(void);
@@ -53,23 +52,6 @@
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))
{
Index: lib/csu/riscv/crt1_s.S
===================================================================
--- lib/csu/riscv/crt1_s.S
+++ lib/csu/riscv/crt1_s.S
@@ -33,60 +33,24 @@
* 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 "libc_private.h"
-#include "crtbrand.c"
-#include "ignore_init.c"
-
-typedef void (*fptr)(void);
-
-#ifdef GCRT
-extern void _mcleanup(void);
-extern void monstartup(void *, void *);
-extern int eprol;
-extern int etext;
-#endif
-
-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))
-{
-
- 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));
-}
+#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
Index: sys/sys/elf_common.h
===================================================================
--- sys/sys/elf_common.h
+++ sys/sys/elf_common.h
@@ -46,12 +46,14 @@
* not include the padding.
*/
+#ifndef LOCORE
typedef struct {
u_int32_t n_namesz; /* Length of name. */
u_int32_t n_descsz; /* Length of descriptor. */
u_int32_t n_type; /* Type of this note. */
} Elf_Note;
typedef Elf_Note Elf_Nhdr;
+#endif
/*
* Option kinds.
@@ -112,12 +114,14 @@
* The header for GNU-style hash sections.
*/
+#ifndef LOCORE
typedef struct {
u_int32_t gh_nbuckets; /* Number of hash buckets. */
u_int32_t gh_symndx; /* First visible symbol in .dynsym. */
u_int32_t gh_maskwords; /* #maskwords used in bloom filter. */
u_int32_t gh_shift2; /* Bloom filter shift count. */
} Elf_GNU_Hash_Header;
+#endif
/* Indexes into the e_ident array. Keep synced with
http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
Index: sys/sys/param.h
===================================================================
--- sys/sys/param.h
+++ sys/sys/param.h
@@ -136,9 +136,11 @@
#endif
#ifndef _KERNEL
+#ifndef LOCORE
/* Signals. */
#include <sys/signal.h>
#endif
+#endif
/* Machine type dependent parameters. */
#include <machine/param.h>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 28, 9:13 AM (7 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32264637
Default Alt Text
D25211.id73005.diff (31 KB)
Attached To
Mode
D25211: Remove the sed hack for ABI tag notes.
Attached
Detach File
Event Timeline
Log In to Comment