2013-10-04 74 views
4

我目前正在爲我的Ubuntu機器上的Raspberry Pi執行一些交叉編譯測試。我目前的理解是Raspberry Pi支持硬件浮點,默認的Raspbian OS圖像是用硬件浮點(armhf)構建的。正確?Raspberry Pi ARM浮動ABI兼容性

如果我使用「arm-linux-gnueabi」工具鏈構建我的應用程序(不指定任何ARM標誌),那麼我的應用程序將使用軟浮點ABI。正確?

在這種情況下,我所有的依賴項也必須使用相同的ABI才能正確鏈接。正確?

如果我的應用程序使用軟浮點ABI,那麼我的應用程序肯定會連接到軟浮點ABI共享標準庫。當我在我的Raspberry Pi上運行我的應用程序時,一切都按預期工作。這怎麼可能,如果Raspbian使用硬浮動ABI(我猜測共享標準庫也是這樣)?

FYI:我的默認ARM-Linux的gnueabi配置有:

--with-float=soft 
--with-arch=armv5 

而且我編譯我的應用程序是這樣的:

arm-linux-gnueabi-g++ test.cpp -o test 

我的程序不包括浮點計算:

double test = (123.456 + 789.123) * 1.23; 
printf("%f\n", test); // prints: 1122.472170 
printf("%f\n", std::floor(test)); // prints: 1122.000000 
+0

你在程序中使用浮點嗎? – syam

+0

可能是你的應用程序根本不使用浮點數? – auselen

+0

我試圖「打破它」。見上面的編輯。 – pqvst

回答

7

你所有的肯定都是正確的,我只是想補充一點精確的關注點ng Raspbian的armhf

Debian的armhfarm-linux-gnueabihf)目標ARMv7t hard-float。由於Raspbian是基於Debian的,所以你會期望相同,但Raspbian的armhf目標ARMv6 hard-float(這是Raspbian存在的首要原因:找到Debian的armel之間的中間地帶 - ARMv4t soft -float - 和armhf體系結構來正確利用Raspberry的CPU)。

因此Raspbian談到armhf有點詭異,尤其是因爲很多人會使用Debian(或者像Ubuntu這樣的衍生產品)作爲主機系統,因此很可能會混淆這兩者。如果你問我,Raspbian的人保留了相同的架構名稱是錯誤的,它應該是arm6hf

當我在我的Raspberry Pi上運行我的應用程序時,一切都按預期工作。這怎麼可能,如果Raspbian使用硬浮動ABI(我猜測共享標準庫也是這樣)?

據我所知,arm-linux-gnueabiarm-linux-gnueabihf之間的唯一區別是,涉及浮點(前者通過他們使用整數寄存器,後者使用浮點寄存器)的調用約定。

如果您從未在測試程序中使用浮點ABI(我的意思是您不通過CPU/FPU寄存器將浮點數傳遞到外部庫 - 但是您可以在內部完美地進行浮點計算 - 使用軟浮點數 - 例如在實際在第三方庫中「使用」結果之前將結果轉換爲int),那麼您將永遠不會遇到ABI差異和所有工作。

關於你給浮點使用的例子,我認爲它們屬於我剛剛描述的類別:你從不使用硬浮點ABI。

  • 在所有的可能性std::floor內聯(確保這是看你的程序集轉儲的最佳方式)。
  • printf使用可變參數,所以你實際上使用傳統的C調用約定,即。參數將通過堆棧傳遞,而不通過CPU/FPU寄存器。

無論如何,你應該從你目前的arm-linux-gnueabi工具鏈避開,並使用一個專門爲Raspbian設計。只需在網上搜索「Raspberry Pi交叉編譯器」即可。這樣你就不會感到困擾。