了解Rust库的依赖关系

我正在为教育目的编写一个针对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将调用这些调用.

我的处理器是ARM​​v6,并且支持原子命令.但是,我没有告诉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”,我可以解决链接器错误.

点赞