gpt4 book ai didi

rust - 如何手动向 lld 提供 core::panicking::panic*?

转载 作者:行者123 更新时间:2023-12-04 13:51:28 25 4
gpt4 key购买 nike

我正在将 rlib 的 Rust 代码编译为 LLVM IR,然后使用 Clang 将其编译并与 C 程序链接。这一直有效,直到我的代码包含 panic ,此时我收到链接器错误:

ld.lld: error: undefined symbol: core::panicking::panic_bounds_check::hc3a71010bf41c72d
>>> referenced by ld-temp.o
>>> lto.tmp:(run)
>>> referenced by ld-temp.o
>>> lto.tmp:(run)
>>> referenced by ld-temp.o
>>> lto.tmp:(run)
>>> referenced 11 more times

ld.lld: error: undefined symbol: core::panicking::panic::hd695e3b1d0dd4ef4
>>> referenced by ld-temp.o
>>> lto.tmp:(run)
clang: error: ld.lld command failed with exit code 1 (use -v to see invocation)
我尝试了两件事来缓解这种情况:
  • 我添加了一个 panic_handler到我的图书馆:
    use core::panic::PanicInfo;

    #[panic_handler]
    pub extern fn panic(_: &PanicInfo<'_>) -> ! {
    loop{}
    }
  • 我已经设置了 panic模式到 abort在我的 Cargo.toml :
    [profile.release]
    panic = "abort"

  • 单独或联合都不能解决问题。
    更多细节
    在评论中,@Solomon Ucko 要求提供有关整个编译管道的更多详细信息。正如我在标签中所写,这是与 no_std ;另外,编译目标是 MOS 6502 .这是要编译和(尝试)链接的命令的完整列表:
    llvm-mos/bin/clang --config llvm-mos-sdk/build/commodore/64.cfg \
    -O2 -c \
    -o _build/main.c.o \
    src/main.c
    cargo rustc --release -- \
    -C debuginfo=0 -C opt-level=1 --emit=llvm-ir
    llvm-mos/bin/clang --config llvm-mos-sdk/build/commodore/64.cfg \
    -O2 \
    -o _build/charset.prg \
    _build/main.c.o \
    target/release/deps/chip8_c64-e21ff59526dd729a.ll

    最佳答案

    基于 this answer ,我通过传递 -Z build-std 解决了这个问题到 Cargo,从而从 Rust 的 core 获得 LLVM IR库,并将其链接。
    但后来我意识到我可以做得更好,并避免 -Z std 强加的长时间编译时间。 ,通过只采用的定义core::panicking::panic_bounds_checkcore::panicking::panic从这些 IR 文件中,简化它们的主体,并将它们添加到手写 panic.ll文件:

    %"panic::location::Location" = type { { [0 x i8]*, i64 }, i32, i32 }

    ; core::panicking::panic
    ; Function Attrs: cold noinline noreturn nounwind nonlazybind
    define void @_ZN4core9panicking5panic17hd695e3b1d0dd4ef4E([0 x i8]* noalias nonnull readonly align 1 %expr.0, i64 %expr.1, %"panic::location::Location"* noalias readonly align 8 dereferenceable(24) %0) unnamed_addr #22 {
    start:
    unreachable
    }

    ; core::panicking::panic_bounds_check
    ; Function Attrs: cold noinline noreturn nounwind nonlazybind
    define void @_ZN4core9panicking18panic_bounds_check17hc3a71010bf41c72dE(i64 %0, i64 %1, %"panic::location::Location"* noalias readonly align 8 dereferenceable(24) %2) unnamed_addr #22 {
    start:
    unreachable
    }
    TBH 我不确定它有多健壮(也许他们应该在 `unreachable 之前通过分支循环到 start?),但至少它让我得到了一个完全链接和可运行的程序。

    关于rust - 如何手动向 lld 提供 core::panicking::panic*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69055494/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com