Rust系统Bootloader链接错误求助:未定义符号__rustc::rust_begin_unwind
问题
严格按照教程完成第二章内容后,构建bootloader时出现链接错误,具体报错如下:
Building bootloader Compiling bootloader v0.9.30 (/home/radue/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bootloader-0.9.30) error: linking with `rust-lld` failed: exit status: 1 | = note: "rust-lld" "-flavor" "gnu" "--script=linker.ld" "--gc-sections" "/tmp/rustco4qhbD/symbols.o" "<4 object files omitted>" "--as-needed" "-Bstatic" "/home/radue/RustroverProjects/untitled/target/bootimage/bootloader/x86_64-bootloader/release/deps/{libxmas_elf-5d65d2bf96cae931.rlib,libzero-7687372b2590b98d.rlib,libx86_64-51db3ea7fbab3b39.rlib,libvolatile-a65ebc85f9994f32.rlib,libbitflags-d0b0465c0016cac0.rlib,libbit_field-d84f3e3f48fe7d8b.rlib,libusize_conversions-83f8cb4f56f96380.rlib,libfixedvec-c637a26df226bd98.rlib,libbootloader-22099723311d027c.rlib,librlibc-9db6015d2d748be6.rlib,librustc_std_workspace_core-0f32d5b194ffc9d8.rlib,libcore-df0460c8357f8b8d.rlib,libcompiler_builtins-0049d8cc3182492c.rlib}.rlib" "-L" "/tmp/rustco4qhbD/raw-dylibs" "-Bdynamic" "--eh-frame-hdr" "-z" "noexecstack" "-L" "/home/radue/RustroverProjects/untitled/target/bootimage/bootloader/x86_64-bootloader/release/build/bootloader-45705ba959b703b7/out" "-o" "/home/radue/RustroverProjects/untitled/target/bootimage/bootloader/x86_64-bootloader/release/deps/bootloader-25df0860a36a3c81" "--gc-sections" "-O1" = note: some arguments are omitted. use `--verbose` to show all linker arguments = note: rust-lld: error: undefined symbol: __rustc::rust_begin_unwind >>> referenced by panicking.rs:75 (src/panicking.rs:75) >>> core-df0460c8357f8b8d.core.806e4ebd01a4702-cgu.12.rcgu.o:(core::panicking::panic_fmt::hbefbee8686df1135) in archive /home/radue/RustroverProjects/untitled/target/bootimage/bootloader/x86_64-bootloader/release/deps/libcore-df0460c8357f8b8d.rlib error: could not compile `bootloader` (bin "bootloader") due to 1 previous error Error: Bootloader build failed. Stderr:
原因分析
这个错误是因为在no_std裸机环境下,Rust标准库的panic unwind机制没有被实现。__rustc::rust_begin_unwind是panic触发时的unwind入口函数,而bootloader这类底层程序默认不会包含该函数的实现。
解决方法
1. 禁用panic unwind
在项目根目录的Cargo.toml中添加以下配置,强制panic时直接终止程序,而非尝试执行unwind:
[profile.dev] panic = "abort" [profile.release] panic = "abort"
2. 检查版本兼容性
你使用的bootloader版本是v0.9.30,该版本可能与当前Rust nightly版本不兼容:
- 可以通过
rustup override set nightly-YYYY-MM-DD降级Rust到bootloader v0.9.30兼容的版本(具体版本可参考bootloader官方文档) - 或者升级bootloader到最新兼容版本,修改
Cargo.toml中的依赖版本后重新构建
3. 确认目标环境配置正确
确保已正确设置裸机目标及链接器,在.cargo/config.toml中添加或检查以下配置:
[build] target = "x86_64-unknown-none" [target.x86_64-unknown-none] linker = "rust-lld"
内容的提问来源于stack exchange,提问作者radueduard
相关产品推荐
相关产品推荐

