我正在将 rlib 的 Rust 代码编译为 LLVM IR,然后使用 Clang 编译并将其与 C 程序链接。这一直有效,直到我的代码包含恐慌,此时我得到链接器错误:
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