我正在为教育目的编写一个针对ARM的嵌入式Rust程序.
由于它是裸机系统,我只使用核心库.该库的手册页声称corelib取决于什么,但memcpy,memcmp和memset,以及展开函数(见 https://doc.rust-lang.org/core/index.html).
但是,特别是如果我使用 atomic types,由于缺少符号,我继续收到链接器错误,例如__sync_val_compare_and_swap_4或__sync_lock_test_and_set_4表示缺少 compiler-rt库.我明白,编译器-rt应该在corelib之上.这看起来像循环依赖,不应该是什么.另外,据我所知,compiler-rt依赖于操作系统.
>我理解的哪一部分不正确?
>我怎样才能获得真正独立的corelib,或者它的哪些部分真正独立?我知道我可以重新实现缺失的功能,但它们似乎相当多.另外,我知道compiler-builtins crate,但它仍然留下了未解决的符号.
最佳答案 与此同时,我找到了解决方案.我分享它希望它对其他人有用.
正如kennytm正确提到的,符号不属于compiler_rt.另外,符号只是偶然与libgcc,c.f的函数相同. here.如果CPU不支持cmpxchg等原子命令,llvm将调用这些调用.
我的处理器是ARMv6,并且支持原子命令.但是,我没有告诉Rust / llvm:目标描述的JSON文件看起来像这样:
{ "llvm-target": "arm-none-eabihf",
"target-endian": "little",
"target-pointer-width": "32",
"os": "none",
"env": "eabihf",
"vendor": "unknown",
"arch": "arm",
"linker": "arm-none-eabi-gcc",
"linker-flavor": "gnu",
"data-layout": "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64",
"executables": true,
"relocation-model": "static",
"no-compiler-rt": true
}
通过这种方式,我的CPU也可能是一个不支持原子命令的ARMv5.通过添加字段“cpu”:“arm1176jzf-s”,我可以解决链接器错误.