交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)
在linux系統下搞嵌入式開發,交叉編譯器那肯定是必備工具。用的場合多了,就會見到各種各樣的編譯工具,比如:
- arm-linux-gcc
- arm-linux-gnueabi-gcc
- arm-none-linux-eabi-gcc
- arm-none-symbianelf-gcc
- arm-none-uclinuxeabi-gcc
- arm-none-linux-gnueabi-gcc
- arm-cortex_a8-linux-gnueabi-gcc
- mips-malta-linux-gnu-gcc
這些編譯工具為什么這么叫,各自有什么含義,又分別用在什么場合,你都知道嗎?下面就來一一講解一下。
一、命名總則
一般來說,交叉編譯工具鏈的命名規則為:arch-core-kernel-system-language。其中:
- arch:體系架構,如ARM,MIPS,等,表示該編譯器用于哪個目標平臺;
- core:使用的是哪個CPU Core,如Cortex A8;或者是指定工具鏈的供應商。如果沒有特殊指定,則留空不填。這一組命名比較靈活,在某些廠家提供的交叉編譯鏈中,有以廠家名稱命名的,也有以開發板命名的,或者直接是none或cross的;
- kernel: 所運行的OS,見過的有Linux,uclinux,bare(無OS);
- system:交叉編譯鏈所選擇的庫函數和目標映像的規范,如gnu,gnueabi等。其中gnu等價于glibc+oabi;gnueabi等價于glibc+eabi。若不指定,則也可以留空不填;
- language:編譯語言,表示該編譯器用于編譯何種語言,最常見的就是gcc,g++;
注意:這個規則是一個猜測,并沒有在哪份官方資料上看到過。而且有些編譯鏈的命名確實沒有按照這個規則,也不清楚這是不是歷史原因造成的。如果有誰在資料上見到過此規則的詳細描述,歡迎指出錯誤。
二、實例說明
下面拿幾個實際應用中最常見的編譯器進行舉例說明:
1、arm-linux-gcc
2、arm-none-linux-gnueabi-gcc
先解釋一下第二個"arm-none-linux-gnueabi-gcc",它表達的是一個不指定具體工具鏈供應商的、可用于基于ARM架構的Linux系統的編譯器,可用于編譯 ARM 架構的 u-boot、Linux內核、linux應用等。
arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已經被Mentor收購)基于GCC推出的的ARM交叉編譯工具。可用于交叉編譯ARM系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
arm-none-linux-gnueabi基于gcc,使用Glibc庫,它的浮點運算非常優秀。一般ARM9、ARM11、Cortex-A 內核,帶有 Linux 操作系統都會用得到。
然后我們再來看arm-linux-gcc與arm-none-linux-gnueabi-gcc之間的關系。
簡單來說,arm-linux-gcc 是 arm-none-linux-gnueabi-gcc 的一個軟鏈接。如下:
leon@Ubuntu:/opt/mini2440/toolschain/4.4.3/bin$ ls -l arm-linux-gcc lrwxrwxrwx 1 leon leon 26 7月 24 2010 arm-linux-gcc -> arm-none-linux-gnueabi-gcc這是我本人所安裝了友善之臂提供的arm-linux-gcc v4.4.3版本的編譯器。
如果想要安裝該編譯器,根據我本人目前搜索到的資料,貌似沒有現成的apt-get install命令可以直接安裝,只能自己去官網(http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/)下載安裝包,自己編譯和安裝。具體的安裝和編譯步驟,此處就不進行詳細描述,大家自行搜索,很多。
另外該網站還有許多其他架構平臺(misp、x86、powerpc)的編譯器,下載地址為:
http://sourcery.mentor.com/public/gnu_toolchain/。
3、arm-linux-gnueabi-gcc
翻譯過來就是,基于arm架構的,適用于任何CPU型號,linux系統下的,可編譯出符合GNU規范以及嵌入式平臺ABI接口要求的,c語言的編譯器。
同理,該編譯器套裝中用于編譯c++的組件,名字叫做arm-linux-gnueabi-g++。
在ubuntu系統下,該編譯器套裝組建可使用以下命令直接安裝:
sudo apt-get install gcc-arm-linux-gnueabi sudo apt-get install g++-arm-linux-gnueabi4、arm-linux-gnueabihf-gcc
arm-linux-gnueabihf-gcc是由 Linaro 公司(http://www.linaro.org/)基于GCC推出的ARM交叉編譯工具,可用于交叉編譯ARM系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。
arm-linux-gneabihf-gcc 與 CodeSourcery 的 arm-none-linux-gnueabi-gcc 類似,都可以用來編譯基于ARM平臺所有環節代碼,CodeSourcery 的交叉編譯工具發布較早,從2005年開始一直到現在。Linaro 則是由ARM、飛思卡爾、IBM、Samsung、ST-Ericsson和TI等廠商聯合,為開發不同半導體公司系統單芯片(SoC)平臺的共通軟件的一個非盈利公司。Linaro于2010年成立,并于當年11月發布第一版ARM Cortex-A 為核心的 SoC 進行效能優化的軟件工具。
請注意將它與上面第二點的arm-linux-gnueabi-gcc區分,這是兩個不同的編譯器。他們分別適用于 armel 和 armhf 兩個不同的架構,詳見下面第三點的解釋。
5、arm-none-eabi-gcc
翻譯過來就是,基于arm架構的,適用于任何CPU型號(也可理解成不指定具體的工具鏈供應商),不帶操作系統的裸機系統(包括 ARM Linux 的 boot、kernel,不適用于編譯 Linux 應用 Application),可編譯出符合嵌入式平臺ABI接口要求的,c語言的編譯器。一般適合 ARM7、Cortex-M 和 Cortex-R 內核的芯片使用,所以不支持那些跟操作系統關系密切的函數,比如fork(2),它使用的是 newlib 這個專用于嵌入式系統的C庫。
注:這里有一個概念,叫ABI/EABI,請參見第三點的解釋。
6、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc。
arm-none-symbianelf 用于symbian,沒用過,不知道C庫是什么。
7、armcc
ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程序(u-boot、kernel),但是不能編譯 Linux 應用程序。armcc一般和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,所以 armcc 編譯器都是收費的(愛國版除外,呵呵~~)。
三、幾個概念
1、ABI與EABI
- ABI:二進制應用程序接口(Application Binary Interface)。在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口;
- EABI:即嵌入式ABI,應用于嵌入式系統的二進制應用程序接口(Embeded Application Binary Interface)。EABI指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區別是,ABI是計算機上的,EABI是嵌入式平臺上(如ARM,MIPS等)。
2、gnueabi與gnueabihf
- 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中的浮點寄存器傳,省去了轉換,性能最好,但是中斷負荷高。
最后附上搜集到的幾個下載地址鏈接:
1、mentor官網:【
https://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/】
2、ARM官網:【https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads】
3、linaro官網:【https://www.linaro.org/downloads/】
4、gnu官網:【ftp://ftp.gnu.org/gnu/gcc】
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计时速 350 公里,贵南高铁广西段顺
- 下一篇: AMD 未曾忘记 Radeon RX 6