Skip to content

Commit 8eaa5a9

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 49654b3 commit 8eaa5a9

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

Makefile

+13-2
Original file line numberDiff line numberDiff line change
@@ -967,8 +967,19 @@ export CC_FLAGS_LTO
967967
endif
968968

969969
ifdef CONFIG_CFI_CLANG
970-
CC_FLAGS_CFI := -fsanitize=kcfi
971-
KBUILD_CFLAGS += $(CC_FLAGS_CFI)
970+
CC_FLAGS_CFI := -fsanitize=kcfi
971+
ifdef CONFIG_RUST
972+
# If Rust is enabled, this flag is required to support cross-language
973+
# integer types.
974+
# This addresses the problem that on e.g. i686, int != long, and Rust
975+
# maps both to i32.
976+
# See https://rcvalle.com/docs/rust-cfi-design-doc.pdf for details.
977+
CC_FLAGS_CFI += -fsanitize-cfi-icall-experimental-normalize-integers
978+
RS_FLAGS_CFI := -Zsanitizer=kcfi -Zsanitizer-cfi-normalize-integers
979+
KBUILD_RSFLAGS += RS_FLAGS_CFI
980+
export RS_FLAGS_CFI
981+
endif
982+
KBUILD_CFLAGS += $(CC_FLAGS_CFI)
972983
export CC_FLAGS_CFI
973984
endif
974985

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-1
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE
364364
quiet_cmd_exports = EXPORTS $@
365365
cmd_exports = \
366366
$(NM) -p --defined-only $< \
367-
| awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@
367+
| awk '$$2~/(T|R|D)/ && $$3!~/__cfi/ {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@
368368

369369
$(obj)/exports_core_generated.h: $(obj)/core.o FORCE
370370
$(call if_changed,exports)

scripts/generate_rust_target.rs

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

0 commit comments

Comments
 (0)