理解Rust库的依赖关系

理解Rust库的依赖关系,rust,llvm,Rust,Llvm,我正在为教育目的编写一个ARM嵌入式Rust程序。 因为它是一个裸机系统,所以我只使用核心库。该库的手册页面声称corelib不依赖任何东西,只依赖于memcpy、memcmp和memset,以及展开功能(请参阅)。 但是,特别是如果我使用,我会继续得到链接器错误,因为缺少符号,例如表示缺少库的\uuuu sync\u val\u compare\u和\u swap\u 4或\uu sync\u lock\u test\u和\u set\u 4。我理解,编译器rt应该位于corelib之上。这看

我正在为教育目的编写一个ARM嵌入式Rust程序。 因为它是一个裸机系统,所以我只使用核心库。该库的手册页面声称corelib不依赖任何东西,只依赖于
memcpy
memcmp
memset
,以及展开功能(请参阅)。
但是,特别是如果我使用,我会继续得到链接器错误,因为缺少符号,例如表示缺少库的
\uuuu sync\u val\u compare\u和\u swap\u 4
\uu sync\u lock\u test\u和\u set\u 4
。我理解,编译器rt应该位于corelib之上。这看起来像一个循环依赖,不应该是什么。此外,我知道编译器rt反过来依赖于操作系统

  • 我的理解哪一部分是不正确的
  • 如何获得真正独立的corelib,或者它的哪些部分是真正独立的?我知道我可以重新实现缺失的功能,但它们似乎很多。此外,我知道,但它仍然给我留下了未解决的符号
    与此同时,我找到了一个解决办法。我分享它,希望它对其他人有用

    正如kennytm正确提到的,这些符号不属于编译器。此外,这些符号只是碰巧与libgcc,c.f.函数中的符号相同。如果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”我可以解决链接器错误

    编译器-rt不提供
    \u同步\u值\u比较\u和\u交换\u 4
    。链接到
    libgcc\s
    是否有效?(ref)@kennytm:还没有,我甚至不确定我是否有它用于目标平台,但我会尝试一下。然而,llvm应该需要libgcc_,这有点奇怪。链接的问题使用GCC4,我不知道llvm的等价物是什么:)