aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Chagin <dchagin@FreeBSD.org>2023-07-07 16:56:02 +0000
committerDmitry Chagin <dchagin@FreeBSD.org>2023-07-07 16:56:02 +0000
commitbae6bb0698ee727df601e4418153787b5b4b0c9d (patch)
tree95562b31067adca5057db6e5b1aabd82ed3d6d0a
parent1a2aa2ffb502403dc1f087722d1482c3c6e8d12b (diff)
downloadsrc-bae6bb0698ee727df601e4418153787b5b4b0c9d.tar.gz
src-bae6bb0698ee727df601e4418153787b5b4b0c9d.zip
csu: Implement _start using as to satisfy unwinders on aarch64
The right unwinding stop indicator should be CFI-undefined PC. https://dwarfstd.org/doc/Dwarf3.pdf - page 118: If a Return Address register is defined in the virtual unwind table, and its rule is undefined (for example, by DW_CFA_undefined), then there is no return address and no call address, and the virtual unwind of stack activations is complete. Reviewed by: Differential Revision: https://reviews.freebsd.org/D40623
-rw-r--r--lib/csu/aarch64/Makefile3
-rw-r--r--lib/csu/aarch64/crt1_c.c15
-rw-r--r--lib/csu/aarch64/crt1_s.S24
3 files changed, 25 insertions, 17 deletions
diff --git a/lib/csu/aarch64/Makefile b/lib/csu/aarch64/Makefile
index d8d0d3fd8f99..72be8b70ef19 100644
--- a/lib/csu/aarch64/Makefile
+++ b/lib/csu/aarch64/Makefile
@@ -4,6 +4,7 @@
CFLAGS+= -I${.CURDIR}
-CRT1OBJS+= crt1_s.o
+CRT1SRC= crt1_s.S
+CRT1OBJ= crt1_c.o
.include <bsd.lib.mk>
diff --git a/lib/csu/aarch64/crt1_c.c b/lib/csu/aarch64/crt1_c.c
index 7f4fea37ba1a..095c798046b4 100644
--- a/lib/csu/aarch64/crt1_c.c
+++ b/lib/csu/aarch64/crt1_c.c
@@ -32,19 +32,4 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "libc_private.h"
#include "csu_common.h"
-
-void __start(int, char **, char **, void (*)(void)) __dead2;
-
-/* The entry function. */
-void
-__start(int argc, char *argv[], char *env[], void (*cleanup)(void))
-{
-#ifdef GCRT
- __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext);
-__asm__("eprol:");
-#else
- __libc_start1(argc, argv, env, cleanup, main);
-#endif
-}
diff --git a/lib/csu/aarch64/crt1_s.S b/lib/csu/aarch64/crt1_s.S
index 65803c8246ae..17ed74531675 100644
--- a/lib/csu/aarch64/crt1_s.S
+++ b/lib/csu/aarch64/crt1_s.S
@@ -32,13 +32,35 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+ /*
+ * The program entry point
+ * void _start(char **ap, void (*cleanup)(void)) __dead2
+ */
ENTRY(_start)
+ .cfi_undefined x30
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
+#ifdef PIC
+ adrp x4, main
+ add x4, x4, :lo12:main
+#else
+ ldr x4, =main
+#endif
+#ifdef GCRT
+ ldr x5, =eprol
+ ldr x6, =etext
+ /*
+ * __libc_start1_gcrt(argc, argv, env, cleanup, main, &eprol, &etext)
+ */
+ bl __libc_start1_gcrt
+eprol:
+#else
+ /* __libc_start1(argc, argv, env, cleanup, main) */
+ bl __libc_start1
+#endif
END(_start)
.section .note.GNU-stack,"",@progbits