@@ -20,6 +20,7 @@
#include <sys/asm.h>
ENTRY (__longjmp)
+ LPAD
REG_L ra, 0*SZREG(a0)
REG_L s0, 1*SZREG(a0)
REG_L s1, 2*SZREG(a0)
new file mode 100644
@@ -0,0 +1,4 @@
+/* crti.S is empty because .init_array/.fini_array are used exclusively.
+ Include sysdep.h to define gnu property if necessary. */
+
+#include <sysdep.h>
new file mode 100644
@@ -0,0 +1,4 @@
+/* crtn.S is empty because .init_array/.fini_array are used exclusively.
+ Include sysdep.h to define gnu property if necessary. */
+
+#include <sysdep.h>
@@ -28,6 +28,13 @@
#include <dl-irel.h>
#include <dl-static-tls.h>
#include <dl-machine-rel.h>
+/* This is a marker to remind us to add real expansion to setup the label
+ for the function signature label scheme in the future */
+#ifdef __riscv_landing_pad_unlabeled
+# define SET_LPAD
+#else
+# define SET_LPAD
+#endif
#ifndef _RTLD_PROLOGUE
# define _RTLD_PROLOGUE(entry) \
@@ -127,6 +134,7 @@ elf_machine_dynamic (void)
# Pass our finalizer function to _start.\n\
lla a0, _dl_fini\n\
# Jump to the user entry point.\n\
+ " STRINGXV (SET_LPAD) "\n\
jr s0\n\
" _RTLD_EPILOGUE (ENTRY_POINT) \
_RTLD_EPILOGUE (_dl_start_user) "\
@@ -29,9 +29,11 @@
# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
#else
# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
+# define FREG_BASE_OFFSET (10*SZREG)
#endif
ENTRY (_dl_runtime_resolve)
+ LPAD
# Save arguments to stack.
addi sp, sp, -FRAME_SIZE
REG_S ra, 9*SZREG(sp)
@@ -45,23 +47,23 @@ ENTRY (_dl_runtime_resolve)
REG_S a7, 8*SZREG(sp)
#ifndef __riscv_float_abi_soft
- FREG_S fa0, (10*SZREG + 0*SZFREG)(sp)
- FREG_S fa1, (10*SZREG + 1*SZFREG)(sp)
- FREG_S fa2, (10*SZREG + 2*SZFREG)(sp)
- FREG_S fa3, (10*SZREG + 3*SZFREG)(sp)
- FREG_S fa4, (10*SZREG + 4*SZFREG)(sp)
- FREG_S fa5, (10*SZREG + 5*SZFREG)(sp)
- FREG_S fa6, (10*SZREG + 6*SZFREG)(sp)
- FREG_S fa7, (10*SZREG + 7*SZFREG)(sp)
+ FREG_S fa0, (FREG_BASE_OFFSET + 0*SZFREG)(sp)
+ FREG_S fa1, (FREG_BASE_OFFSET + 1*SZFREG)(sp)
+ FREG_S fa2, (FREG_BASE_OFFSET + 2*SZFREG)(sp)
+ FREG_S fa3, (FREG_BASE_OFFSET + 3*SZFREG)(sp)
+ FREG_S fa4, (FREG_BASE_OFFSET + 4*SZFREG)(sp)
+ FREG_S fa5, (FREG_BASE_OFFSET + 5*SZFREG)(sp)
+ FREG_S fa6, (FREG_BASE_OFFSET + 6*SZFREG)(sp)
+ FREG_S fa7, (FREG_BASE_OFFSET + 7*SZFREG)(sp)
#endif
# Update .got.plt and obtain runtime address of callee.
slli a1, t1, 1
mv a0, t0 # link map
add a1, a1, t1 # reloc offset (== thrice the .got.plt offset)
- la a2, _dl_fixup
- jalr a2
- mv t1, a0
+ la t2, _dl_fixup
+ jalr t2
+ mv t2, a0
# Restore arguments from stack.
REG_L ra, 9*SZREG(sp)
@@ -75,20 +77,20 @@ ENTRY (_dl_runtime_resolve)
REG_L a7, 8*SZREG(sp)
#ifndef __riscv_float_abi_soft
- FREG_L fa0, (10*SZREG + 0*SZFREG)(sp)
- FREG_L fa1, (10*SZREG + 1*SZFREG)(sp)
- FREG_L fa2, (10*SZREG + 2*SZFREG)(sp)
- FREG_L fa3, (10*SZREG + 3*SZFREG)(sp)
- FREG_L fa4, (10*SZREG + 4*SZFREG)(sp)
- FREG_L fa5, (10*SZREG + 5*SZFREG)(sp)
- FREG_L fa6, (10*SZREG + 6*SZFREG)(sp)
- FREG_L fa7, (10*SZREG + 7*SZFREG)(sp)
+ FREG_L fa0, (FREG_BASE_OFFSET + 0*SZFREG)(sp)
+ FREG_L fa1, (FREG_BASE_OFFSET + 1*SZFREG)(sp)
+ FREG_L fa2, (FREG_BASE_OFFSET + 2*SZFREG)(sp)
+ FREG_L fa3, (FREG_BASE_OFFSET + 3*SZFREG)(sp)
+ FREG_L fa4, (FREG_BASE_OFFSET + 4*SZFREG)(sp)
+ FREG_L fa5, (FREG_BASE_OFFSET + 5*SZFREG)(sp)
+ FREG_L fa6, (FREG_BASE_OFFSET + 6*SZFREG)(sp)
+ FREG_L fa7, (FREG_BASE_OFFSET + 7*SZFREG)(sp)
#endif
addi sp, sp, FRAME_SIZE
# Invoke the callee.
- jr t1
+ jr t2
END (_dl_runtime_resolve)
#if !defined PROF && defined SHARED
@@ -35,7 +35,11 @@
# define BLOCK_SIZE (16 * SZREG)
.attribute unaligned_access, 1
+#ifdef __riscv_landing_pad
+ .align 2
+#endif
ENTRY (__memcpy_noalignment)
+ LPAD
beq a2, zero, L(ret)
/* if LEN < SZREG jump to tail handling. */
@@ -20,14 +20,17 @@
#include <sys/asm.h>
ENTRY (_setjmp)
+ LPAD
li a1, 0
j HIDDEN_JUMPTARGET (__sigsetjmp)
END (_setjmp)
ENTRY (setjmp)
+ LPAD
li a1, 1
/* Fallthrough */
END (setjmp)
ENTRY (__sigsetjmp)
+ LPAD
REG_S ra, 0*SZREG(a0)
REG_S s0, 1*SZREG(a0)
REG_S s1, 2*SZREG(a0)
@@ -47,12 +47,14 @@ ENTRY (ENTRY_POINT)
.cfi_label to force starting the FDE. */
.cfi_label .Ldummy
cfi_undefined (ra)
+ LPAD
call load_gp
mv a5, a0 /* rtld_fini. */
/* main may be in a shared library. */
#if defined PIC && !defined SHARED
/* Avoid relocation in static PIE since _start is called before it
is relocated. */
+ SET_LPAD
lla a0, __wrap_main
#else
la a0, main
@@ -69,7 +71,11 @@ ENTRY (ENTRY_POINT)
END (ENTRY_POINT)
#if defined PIC && !defined SHARED
+#ifdef __riscv_landing_pad
+ .align 2
+#endif /* __riscv_landing_pad */
__wrap_main:
+ LPAD
tail main@plt
#endif
@@ -79,9 +85,13 @@ __wrap_main:
needs to be initialized before calling __libc_start_main in that case.
So we redundantly initialize it at the beginning of _start. */
+#ifdef __riscv_landing_pad
+ .align 2
+#endif /* __riscv_landing_pad */
load_gp:
.option push
.option norelax
+ LPAD
lla gp, __global_pointer$
.option pop
ret
@@ -46,13 +46,23 @@
# endif
#endif
+/* Landing pad for Zicfilp CFI. */
+#ifndef LPAD
+# ifdef __riscv_landing_pad_unlabeled
+# define LPAD lpad 0
+# else
+# define LPAD
+# endif
+#endif
+
/* Declare leaf routine. */
#define LEAF(symbol) \
.globl symbol; \
.align 2; \
.type symbol,@function; \
symbol: \
- cfi_startproc;
+ cfi_startproc; \
+ LPAD;
/* Mark end of function. */
#undef END
@@ -31,6 +31,7 @@
.text
LEAF (__clone)
+ LPAD
/* Align stack to a 128-bit boundary as per RISC-V ABI. */
andi a1,a1,ALMASK
@@ -82,6 +83,7 @@ L (thread_start):
REG_L a0,SZREG(sp) /* Argument pointer. */
/* Call the user's function. */
+ SET_LPAD
jalr a1
/* Call exit with the function's return value. */
@@ -23,6 +23,7 @@
#endif
ENTRY (__syscall_error)
+ LPAD
mv t0, ra
/* Fall through to __syscall_set_errno. */
END (__syscall_error)
@@ -53,6 +53,75 @@
# include <sys/asm.h>
+/* GNU_PROPERTY_RISCV_* macros from elf.h for use in asm code. */
+#define FEATURE_1_AND 0xc0000000
+
+/* Add a NT_GNU_PROPERTY_TYPE_0 note. */
+#if __riscv_xlen == 32
+# define GNU_PROPERTY(type, value) \
+ .section .note.gnu.property, "a"; \
+ .p2align 2; \
+ .word 4; \
+ .word 12; \
+ .word 5; \
+ .asciz "GNU"; \
+ .word type; \
+ .word 4; \
+ .word value; \
+ .text
+#else
+# define GNU_PROPERTY(type, value) \
+ .section .note.gnu.property, "a"; \
+ .p2align 3; \
+ .word 4; \
+ .word 16; \
+ .word 5; \
+ .asciz "GNU"; \
+ .word type; \
+ .word 4; \
+ .word value; \
+ .word 0; \
+ .text
+#endif
+
+/* Add GNU property note with the supported features to all asm code
+ where sysdep.h is included. */
+#undef __VALUE_FOR_FEATURE_1_AND
+#if defined (__riscv_landing_pad) || defined (__riscv_shadow_stack)
+# if defined (__riscv_landing_pad_unlabeled)
+# if defined (__riscv_shadow_stack)
+# define __VALUE_FOR_FEATURE_1_AND 0x3
+# else
+# define __VALUE_FOR_FEATURE_1_AND 0x1
+# endif
+# elif defined (__riscv_landing_pad_func_sig)
+# if defined (__riscv_shadow_stack)
+# define __VALUE_FOR_FEATURE_1_AND 0x6
+# else
+# define __VALUE_FOR_FEATURE_1_AND 0x4
+# endif
+# else
+# if defined (__riscv_shadow_stack)
+# define __VALUE_FOR_FEATURE_1_AND 0x2
+# else
+# error "What?"
+# endif
+# endif
+#endif
+
+#if defined (__VALUE_FOR_FEATURE_1_AND)
+GNU_PROPERTY (FEATURE_1_AND, __VALUE_FOR_FEATURE_1_AND)
+#endif
+#undef __VALUE_FOR_FEATURE_1_AND
+
+#ifdef __riscv_landing_pad_unlabeled
+# define SET_LPAD
+# define LPAD lpad 0
+#else
+# define SET_LPAD
+# define LPAD
+#endif
+
# define ENTRY(name) LEAF(name)
# define L(label) .L ## label
@@ -111,6 +180,7 @@
# define PSEUDO_NOERRNO(name, syscall_name, args) \
.align 2; \
ENTRY (name); \
+ LPAD; \
li a7, SYS_ify (syscall_name); \
scall;
@@ -29,6 +29,7 @@
.text
LEAF (__libc_vfork)
+ LPAD
li a0, (CLONE_VFORK | CLONE_VM | SIGCHLD)
mv a1, sp