我正在为教育目的编写一个针对ARM的嵌入式Rust程序。
由于它是裸机系统,我只使用核心库。该库的手册页声称corelib取决于任何内容,但$('#wizard').smartWizard({enableAllSteps: true});
,memcpy
和memcmp
以及展开函数(请参阅https://doc.rust-lang.org/core/index.html)。
但是,特别是如果我使用atomic types,我会因为缺少符号而继续收到链接器错误,例如memset
或__sync_val_compare_and_swap_4
表示缺少compiler-rt库。我明白,编译器-rt应该在corelib之上。这看起来像循环依赖,不应该是什么。另外,据我所知,compiler-rt依赖于操作系统。
答案 0 :(得分:2)
与此同时,我找到了解决方案。我分享它希望它对其他人有用。
正如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"
,我可以解决链接器错误。