ARM相關工具鏈發布主要有ARM、Linaro、Codesourcery。
1. 命名規則
交叉編譯工具鏈的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]
- arch - 體系架構,如arm、aarch64
- vendor - 工具鏈提供商,none。
- os - 目標操作系統,linux適用於Linux OS。
- eabi - 嵌入式應用二進制接口(Embedded Application Binary Interface);gnu表示使用glibc
1.1 abi和eabi
ABI:二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程序(或者其他類
型)和操作系統之間或其他應用程序的低級接口。
EABI:嵌入式ABI。嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標准約定。開發
者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區別是,ABI是計算機上的,EABI是嵌入式平台上(如ARM,MIPS等)。
1.2 gnueabi和gnueabihf
在debian源里這兩個交叉編譯器的定義如下:
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中的浮點寄存器傳,省去了轉換, 性能最好,但是中斷負荷高。
2. 實例
arm-linux-gnueabihf-:ARM32架構;編譯目標運行於Linux上;嵌入式,默認支持armhf,使用glibc。
arm-none-linux-gnueabihf-:ARM架構;沒有特定廠商;編譯目標運行在Linux操作系統上,linux kernel、linux app、uboot等;基於gcc使用glibc庫,嵌入式平台;默認支持armhf。
aarch64-linux-gnu-:ARM64架構;編譯目標運行於Linux上;使用glibc。
arm-none-uclinuxeabi-:ARM架構;沒有特定廠商;用於UCLinux操作系統;使用glibc。
aarch64-linux-gnu-:ARM64架構;編譯目標運行在Linux操作系統上;使用glibc。
aarch64-none-linux-gnu-:ARM64架構;不特定廠商;運行在Linux操作系統上;使用glibc。
aarch64-none-elf-:ARM64架構,不特定廠商;偏向裸驅系統。
arm-none-eabi-:arm架構;沒有特定廠商;沒有目標操作系統,一般不支持跟操作系統密切相關的函數,比如Cortex-R、Cortex-M。
3. 下載地址
- 《GNU Arm Embedded Toolchain Downloads GNU-A》:Cortex-A系列CPU工具鏈。
- 《GNU Arm Embedded Toolchain Downloads GNU-RM》:32位 Cortex-A、Cortex-R、Cortex-M系列CPU工具鏈。
- 《GNU cross-toolchain binary archives》:Linaro提供的工具鏈。
- Latest Linux Targeted Binary Toolchain Releases
arm-linux-gnueabihf | 32-bit Armv7 Cortex-A, hard-float, little-endian | Release-Notes | Binaries | Source |
armv8l-linux-gnueabihf | 32-bit Armv8 Cortex-A, hard-float, little-endian | Release-Notes | Binaries | Source |
aarch64-linux-gnu | 64-bit Armv8 Cortex-A, little-endian | Release-Notes | Binaries | Source |
-
- Latest Bare-Metal Targeted Binary Toolchain Releases
arm-eabi | 32-bit Armv7 Cortex-A, soft-float, little-endian | Release-Notes | Binaries | Source |
aarch64-elf | 64-bit Armv8 Cortex-A, little-endian | Release-Notes | Binaries | Source |