2017-05-17 103 views
4

我正在爲教育目的編寫一個ARM嵌入式Rust程序。 由於它是裸機系統,因此我只使用核心庫。該庫的手冊頁宣稱corelib完全依賴於任何內容,但memcpy,memcmpmemset以及展開函數(請參閱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之上。這看起來像循環依賴,不應該是。此外,我明白編譯器rt依次取決於操作系統。瞭解Rust庫的依賴關係

  1. 我的理解是什麼部分是不正確的?
  2. 我該如何獲得一個真正的獨立Corelib,或者它的哪些部分真的是獨立的?我知道我可以重新實現缺失的功能,但它們似乎相當多。另外,我知道compiler-builtins crate,但它仍然給我留下了未解決的符號。
+0

'__sync_val_compare_and_swap_4' * not *由compiler-rt提供。鏈接到'libgcc_s'工作嗎? (參考http://stackoverflow.com/a/9329139/224671) – kennytm

+0

@kennytm:還沒有,我不知道我是否有目標平臺,但我會試一試。但是,llvm應該需要libgcc_s有點奇怪。 – Matthias

+0

鏈接的問題使用GCC 4,我不知道什麼是LLVM等價物:) – kennytm

回答

1

在此期間,我找到了一個解決方案。我分享它,希望它對其他人有用。

正如kennytm正確提到的那樣,這些符號不屬於compiler_rt。另外,這些符號只是偶然的,與libgcc,c.f.的函數相同。 here。如果CPU不支持原子命令(如cmpxchg),這些調用將由llvm發出。

我的處理器是ARM​​v6和確實支持原子命令。不過,我沒有告訴防鏽/ 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"我可以解決鏈接器錯誤。