了解Rust库的依赖关系

时间:2017-05-17 22:49:36

标签: rust llvm

我正在为教育目的编写一个针对ARM的嵌入式Rust程序。 由于它是裸机系统,我只使用核心库。该库的手册页声称corelib取决于任何内容,但$('#wizard').smartWizard({enableAllSteps: true}); memcpymemcmp以及展开函数(请参阅https://doc.rust-lang.org/core/index.html)。 但是,特别是如果我使用atomic types,我会因为缺少符号而继续收到链接器错误,例如memset__sync_val_compare_and_swap_4表示缺少compiler-rt库。我明白,编译器-rt应该在corelib之上。这看起来像循环依赖,不应该是什么。另外,据我所知,compiler-rt依赖于操作系统。

  1. 我理解的哪一部分不正确?
  2. 我如何才能获得真正独立的corelib,或者它的哪些部分真正独立?我知道我可以重新实现缺失的功能,但它们似乎相当多。另外,我知道compiler-builtins crate,但它仍然留下了未解决的符号。

1 个答案:

答案 0 :(得分:2)

与此同时,我找到了解决方案。我分享它希望它对其他人有用。

正如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",我可以解决链接器错误。