ABI與EABI
ABI: Application Binary Interface (ABI) for the ARM Architecture 應用程式機器二元碼介面(英語:application binary interface,縮寫為ABI)是指兩程式模組間的介面;通常其中一個程式模組會是函式庫或作業系統所提供的服務,而另一邊的模組則是使用者所執行的程式。
一個ABI定義了機器碼如何存取資料結構與運算程式,此處所定義的介面相當低階並且相依於硬體。
EABI就是Embedded ABI
arm-linux-gnueabi 和 arm-linux-gnueabihf
在debian源裏這兩個交叉編譯器的定義如下:
gcc-arm-linux-gnueabi - The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf - The GNU C compiler for armhf architecture
gcc-arm-linux-gnueabi - The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf - The GNU C compiler for armhf architecture
可見這兩個交叉編譯器适用於armel和armhf兩個不同的架構, armel和armhf這兩種架構在對待浮點運算採取了不同的策略(有fpu的arm才能支持這兩種浮點運算策略)
其實這兩個交叉編譯器只不過是gcc的選項-mfloat-abi的默認值不同。gcc的選項-mfloat-abi有三種值soft,softfp,hard(其中後兩者都要求arm裏有fpu浮點運算單元,soft與後兩者是兼容的,但softfp和hard兩種模式互不兼容):
soft : 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。
softfp : armel架構(對應的編譯器为gcc-arm-linux-gnueabi)採用的預設值,用fpu計算,但是傳参數用普通暫存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是参數需要轉換成浮點的再計算。
hard : armhf架構(對應的編譯器gcc-arm-linux-gnueabihf)采用的默認值,用fpu計算,傳参數也用fpu中的浮點暫存器傳,省去了轉換, 性能最好,但是中斷負荷高。
其實這兩個交叉編譯器只不過是gcc的選項-mfloat-abi的默認值不同。gcc的選項-mfloat-abi有三種值soft,softfp,hard(其中後兩者都要求arm裏有fpu浮點運算單元,soft與後兩者是兼容的,但softfp和hard兩種模式互不兼容):
soft : 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。
softfp : armel架構(對應的編譯器为gcc-arm-linux-gnueabi)採用的預設值,用fpu計算,但是傳参數用普通暫存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是参數需要轉換成浮點的再計算。
hard : armhf架構(對應的編譯器gcc-arm-linux-gnueabihf)采用的默認值,用fpu計算,傳参數也用fpu中的浮點暫存器傳,省去了轉換, 性能最好,但是中斷負荷高。
把以下測試使用的c文件內容保存成mfloat.c:
#include <stdio.h>
int main(void)
{
double a,b,c;
a = 23.543;
b = 323.234;
c = b/a;
printf("the 13/2 = %f\n", c);
printf("hello world !\n");
return 0;
}
#include <stdio.h>
int main(void)
{
double a,b,c;
a = 23.543;
b = 323.234;
c = b/a;
printf("the 13/2 = %f\n", c);
printf("hello world !\n");
return 0;
}
使用CC -v mfloat.c
可以分析出其中的差別
CC=arm-linux-gcc
COLLECT_GCC_OPTIONS='-v' '-mcpu=arm926ej-s' '-mfloat-abi=soft' '-mabi=aapcs-linux' '-marm' '-mtls-dialect=gnu'
CC=arm-linux-gnueabi-gcc
COLLECT_GCC_OPTIONS='-v' '-march=armv5t' '-mfloat-abi=soft' '-mtls-dialect=gnu'
CC=arm-linux-gnueabihf-gcc
COLLECT_GCC_OPTIONS='-v' '-march=armv7-a' '-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb' '-mtls-dialect=gnu'
另外,通常Vendor會提供對應版本的toolchain,如果要給Vendor板子build code,就必須要有其對應的toolchain去build。
另外,通常Vendor會提供對應版本的toolchain,如果要給Vendor板子build code,就必須要有其對應的toolchain去build。
留言