No_std环境下rust-lld链接自定义Rust内核时出现奇怪错误
Rust自定义内核rust-lld链接错误:undefined symbol core::panicking::panic_nounwind
问题情况
在无标准库、无main函数的No_std环境下开发自定义Rust内核,编译目标为x86_64-unknown-none,已实现带#[panic_handler]注解的panic处理函数,但调用某些无关函数时会偶发触发以下rust-lld链接错误:
error: linking with `rust-lld` failed: exit status: 1 | = note: rust-lld: error: undefined symbol: core::panicking::panic_nounwind::h16c15692d6463ed7 >>> referenced by intrinsics.rs:2510 (/home/kamil/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/intrinsics.rs:2510) >>> compiler_builtins-ec434174929fe3ec.compiler_builtins.578c66a02b9c8733-cgu.0.rcgu.o:(core::ptr::const_ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::read_unaligned::h3b6c56eaac55cbb8) in archive /archive/ARCHIVE/sources/cos/programs/shell/target/x86_64-unknown-none/debug/deps/libcompiler_builtins-ec434174929fe3ec.rlib >>> referenced by intrinsics.rs:2510 (/home/kamil/.rustup/toolchains/nightly-x86_64-unknown-none/lib/rustlib/src/rust/library/core/src/intrinsics.rs:2510) >>> compiler_builtins-ec434174929fe3ec.compiler_builtins.578c66a02b9c8733-cgu.0.rcgu.o:(core::ptr::const_ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::read_unaligned::h48c3b5a4cc6e53f3) in archive /archive/ARCHIVE/sources/cos/programs/shell/target/x86_64-unknown-none/debug/deps/libcompiler_builtins-ec434174929fe3ec.rlib >>> referenced by intrinsics.rs:2510 (/home/kamil/.rustup/toolchains/nightly-x86_64-unknown-none/lib/rustlib/src/rust/library/core/src/intrinsics.rs:2510) >>> compiler_builtins-ec434174929fe3ec.compiler_builtins.578c66a02b9c8733-cgu.0.rcgu.o:(core::ptr::const_ptr::_$LT$impl$u20$$BP$const$u20$T$GT$::read_unaligned::h8c7c7d6c241634dc) in archive /archive/ARCHIVE/sources/cos/programs/shell/target/x86_64-unknown-none/debug/deps/libcompiler_builtins-ec434174929fe3ec.rlib >>> referenced 2 more times
环境版本
rustc --version:rustc 1.73.0-nightly (32303b219 2023-07-29)cargo --version:cargo 1.73.0-nightly (7ac9416d8 2023-07-24)ld.lld --version:LLD 15.0.6 (compatible with GNU linkers)
解决方案
强制panic模式为abort:在项目的
Cargo.toml中添加以下配置,避免编译器尝试链接unwind相关的panic实现:[profile.dev] panic = "abort" [profile.release] panic = "abort"对于nightly工具链,也可以在入口文件顶部添加属性:
#![panic_handler = "your_panic_handler"] #![feature(panic_abort)]调整链接顺序:确保
core库在compiler_builtins之前被链接。检查.cargo/config.toml中的链接器参数,保证指向rustlib的-L路径优先于本地编译的compiler_builtins库。禁用GC Sections优化:链接命令中的
--gc-sections可能误删panic相关符号,可暂时在.cargo/config.toml中移除该参数,或添加参数强制保留符号:[target.x86_64-unknown-none] rustflags = [ "-C", "link-arg=-Wl,--undefined=core::panicking::panic_nounwind", # 其他参数... ]显式引入core库:在入口文件顶部添加
extern crate core;,确保编译器正确包含core库的所有必要符号。更新工具链或compiler_builtins:部分nightly版本可能存在兼容性问题,尝试更新到最新nightly版本,或在
Cargo.toml中指定compiler_builtins版本:compiler_builtins = { version = "0.1.90", features = ["rustc-dep-of-std"] }
内容的提问来源于stack exchange,提问作者kamkow1
相关产品推荐
相关产品推荐

