【问题标题】:Understanding dependencies of Rust libraries了解 Rust 库的依赖关系
【发布时间】:2017-05-17 22:49:36
【问题描述】:

出于教育目的,我正在为 ARM 编写嵌入式 Rust 程序。 由于它是一个裸机系统,我只使用核心库。该库的手册页声称 corelib 不依赖于任何东西,但 memcpymemcmpmemset 以及 unwind 函数(参见 https://doc.rust-lang.org/core/index.html)。 但是,特别是如果我使用 atomic types,由于缺少符号(例如 __sync_val_compare_and_swap_4__sync_lock_test_and_set_4 表示缺少 compiler-rt 库),我会继续收到链接器错误。我理解,compiler-rt 应该在 corelib 之上。这看起来像一个循环依赖,不应该是。另外,我知道 compiler-rt 又依赖于操作系统。

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

【问题讨论】:

  • __sync_val_compare_and_swap_4 不是由 compiler-rt 提供的。链接到libgcc_s 有效吗? (参考stackoverflow.com/a/9329139/224671)
  • @kennytm:还没有,我不确定我是否有它用于目标平台,但我会试一试。但是,llvm 需要 libgcc_s 有点奇怪。
  • 链接的问题使用 GCC 4,我不知道 LLVM 等价物是什么 :)

标签: rust llvm


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多