交叉編譯器的命名規則及詳細解釋(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-gnueabi

4、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】
————————————————
原文鏈接:https://blog.csdn.net/LEON1741/article/details/81537529


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM