You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:17:08