Skip to content

Commit acfded3

Browse files
committed
rust: support for shadow call stack sanitizer
To use the shadow call stack sanitizer, you must pass special flags: * On arm64, you must pass -ffixed-x18 to your C compiler. * On riscv, you must pass --no-relax-gp to your linker. These requirements also apply to Rust code. When using Rust on arm64, you must pass the -Zfixed-x18 flag to rustc, which has the same effect as the -ffixed-x18 flag does for C code. The -Zfixed-x18 flag requires rustc version 1.80.0 or greater. There is no need to pass any flags to rustc on riscv as only the linker requires additional flags on this platform. On older versions of Rust, it is still possible to use shadow call stack by passing -Ctarget-feature=+reserve-x18 instead of -Zfixed-x18. However, this flag emits a warning during the build, so this patch does not add support for using it. Currently, the compiler thinks that the aarch64-unknown-none target doesn't support -Zsanitizer=shadow-call-stack, so the build will fail if you enable shadow call stack in non-dynamic mode. See [1] for the feature request for this. To avoid this compilation failure, Kconfig is set up to reject such configurations. The `depends on` clause is placed on `config RUST` to avoid a situation where enabling Rust silently turns off the sanitizer. Instead, turning on the sanitizer results in Rust being disabled. We generally do not want changes to CONFIG_RUST to result in any mitigations being changed or turned off. To avoid a cyclic dependency between RUST and RUSTC_VERSION, the RUSTC_VERSION symbol is changed to depend on HAVE_RUST instead of RUST. Link: rust-lang/rust#121972 [1] Signed-off-by: Alice Ryhl <aliceryhl@google.com>
1 parent f1bc34e commit acfded3

File tree

3 files changed

+6
-2
lines changed

3 files changed

+6
-2
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,7 @@ ifdef CONFIG_SHADOW_CALL_STACK
945945
ifndef CONFIG_DYNAMIC_SCS
946946
CC_FLAGS_SCS := -fsanitize=shadow-call-stack
947947
KBUILD_CFLAGS += $(CC_FLAGS_SCS)
948+
KBUILD_RUSTFLAGS += -Zsanitizer=shadow-call-stack
948949
endif
949950
export CC_FLAGS_SCS
950951
endif

arch/arm64/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ KBUILD_AFLAGS += $(call cc-option,-mabi=lp64)
5757
ifneq ($(CONFIG_UNWIND_TABLES),y)
5858
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables -fno-unwind-tables
5959
KBUILD_AFLAGS += -fno-asynchronous-unwind-tables -fno-unwind-tables
60+
KBUILD_RUSTFLAGS += -Cforce-unwind-tables=n
6061
else
6162
KBUILD_CFLAGS += -fasynchronous-unwind-tables
6263
KBUILD_AFLAGS += -fasynchronous-unwind-tables
64+
KBUILD_RUSTFLAGS += -Cforce-unwind-tables=y -Zuse-sync-unwind=n
6365
endif
6466

6567
ifeq ($(CONFIG_STACKPROTECTOR_PER_TASK),y)
@@ -114,6 +116,7 @@ endif
114116

115117
ifeq ($(CONFIG_SHADOW_CALL_STACK), y)
116118
KBUILD_CFLAGS += -ffixed-x18
119+
KBUILD_RUSTFLAGS += -Zfixed-x18
117120
endif
118121

119122
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)

init/Kconfig

+2-2
Original file line numberDiff line numberDiff line change
@@ -1906,7 +1906,7 @@ config RUST
19061906
depends on !MODVERSIONS
19071907
depends on !GCC_PLUGINS
19081908
depends on !RANDSTRUCT
1909-
depends on !SHADOW_CALL_STACK
1909+
depends on !SHADOW_CALL_STACK || RUSTC_VERSION >= 108000 && DYNAMIC_SCS
19101910
depends on !DEBUG_INFO_BTF || PAHOLE_HAS_LANG_EXCLUDE
19111911
help
19121912
Enables Rust support in the kernel.
@@ -1923,7 +1923,7 @@ config RUST
19231923

19241924
config RUSTC_VERSION
19251925
int
1926-
depends on RUST
1926+
depends on HAVE_RUST
19271927
default $(rustc-version)
19281928
default 0
19291929

0 commit comments

Comments
 (0)