Skip to content

Commit 23efd72

Browse files
committed
rust: Enable KCFI support when available
On newer clang, a flag is available which makes KCFI compatibility with rustc possible without significant contortions. Signed-off-by: Matthew Maurer <[email protected]>
1 parent 0f2865b commit 23efd72

File tree

5 files changed

+17
-2
lines changed

5 files changed

+17
-2
lines changed

Makefile

+13-2
Original file line numberDiff line numberDiff line change
@@ -976,8 +976,19 @@ export CC_FLAGS_LTO
976976
endif
977977

978978
ifdef CONFIG_CFI_CLANG
979-
CC_FLAGS_CFI := -fsanitize=kcfi
980-
KBUILD_CFLAGS += $(CC_FLAGS_CFI)
979+
CC_FLAGS_CFI := -fsanitize=kcfi
980+
ifdef CONFIG_RUST
981+
# If Rust is enabled, this flag is required to support cross-language
982+
# integer types.
983+
# This addresses the problem that on e.g. i686, int != long, and Rust
984+
# maps both to i32.
985+
# See https://rcvalle.com/docs/rust-cfi-design-doc.pdf for details.
986+
CC_FLAGS_CFI += -fsanitize-cfi-icall-experimental-normalize-integers
987+
RS_FLAGS_CFI := -Zsanitizer=kcfi -Zsanitizer-cfi-normalize-integers
988+
KBUILD_RSFLAGS += RS_FLAGS_CFI
989+
export RS_FLAGS_CFI
990+
endif
991+
KBUILD_CFLAGS += $(CC_FLAGS_CFI)
981992
export CC_FLAGS_CFI
982993
endif
983994

arch/x86/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ ifeq ($(CONFIG_X86_KERNEL_IBT),y)
8181
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104816
8282
#
8383
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=branch -fno-jump-tables)
84+
KBUILD_RUSTFLAGS += -Zcf-protection=branch -Zno-jump-tables
8485
else
8586
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
8687
endif

init/Kconfig

+1
Original file line numberDiff line numberDiff line change
@@ -1889,6 +1889,7 @@ config RUST
18891889
depends on !GCC_PLUGINS
18901890
depends on !RANDSTRUCT
18911891
depends on !DEBUG_INFO_BTF || PAHOLE_HAS_LANG_EXCLUDE
1892+
depends on !CFI_CLANG || $(cc-option,-fsanitize=kcfi,-fsanitize-cfi-icall-experimental-normalize-integers)
18921893
select CONSTRUCTORS
18931894
help
18941895
Enables Rust support in the kernel.

rust/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ quiet_cmd_exports = EXPORTS $@
365365
cmd_exports = \
366366
$(NM) -p --defined-only $< \
367367
| grep -E ' (T|R|D) ' | cut -d ' ' -f 3 \
368+
| grep -v ^__cfi \
368369
| xargs -Isymbol \
369370
echo 'EXPORT_SYMBOL_RUST_GPL(symbol);' > $@
370371

scripts/generate_rust_target.rs

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ fn main() {
178178
}
179179
ts.push("features", features);
180180
ts.push("llvm-target", "x86_64-linux-gnu");
181+
ts.push("supported-sanitizers", ["kcfi"]);
181182
ts.push("target-pointer-width", "64");
182183
} else {
183184
panic!("Unsupported architecture");

0 commit comments

Comments
 (0)