ARM交叉編譯工具鏈分類說明

2021-09-23 05:47:54 字數 2699 閱讀 5265

為什麼要用交叉編譯器?

交叉編譯通俗地講就是在一種平台上編譯出能執行在體系結構不同的另一種平台上的程式,比如在pc平台(x86 cpu)上編譯出能執行在以arm為核心的cpu平台上的程式,編譯得到的程式在x86 cpu平台上是不能執行的,必須放到arm cpu平台上才能執行,雖然兩個平台用的都是linux系統。

分類和說明

從授權上,分為免費授權版和付費授權版。

免費版目前有三大主流工具商提供,第一是gnu(提供原始碼,自行編譯製作),第二是 codesourcery,第三是linora。

收費版有arm原廠提供的armcc、iar提供的編譯器等等,因為這些**都比較昂貴,不適合學習使用者使用,所以不做講述。

交叉編譯工具鏈的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]

arm-none-eabi:這個是沒有作業系統的,自然不可能支援那些跟作業系統關係密切的函式,比如fork(2)。他使用的是newlib這個專用於嵌入式系統的c庫。

arm-none-linux-eabi:用於linux的,使用glibc

例項1、arm-none-eabi-gcc

2、arm-none-linux-gnueabi-gcc

(arm architecture, no vendor, creates binaries that run on the linux operating system, and uses the gnu eabi)

主要用於基於arm架構的linux系統,可用於編譯 arm 架構的 u-boot、linux核心、linux應用等。arm-none-linux-gnueabi基於gcc,使用glibc庫,經過 codesourcery 公司優化過推出的編譯器。arm-none-linux-gnueabi-*** 交叉編譯工具的浮點運算非常優秀。一般arm9、arm11、cortex-a 核心,帶有 linux 作業系統的會用到。

3、arm-eabi-gcc

android arm 編譯器。

4、armcc

arm 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程式(u-boot、kernel),但是不能編譯 linux 應用程式。armcc一般和arm開發工具一起,keil mdk、ads、rvds和ds-5中的編譯器都是armcc,所以 armcc 編譯器都是收費的(愛國版除外,呵呵~~)。

5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc

arm-none-uclinuxeabi 用於uclinux,使用glibc。

arm-none-symbianelf 用於symbian,沒用過,不知道c庫是什麼 。

codesourcery

abi 和 eabi

eabi:嵌入式abi。嵌入式應用二進位制介面指定了檔案格式、資料型別、暫存器使用、堆積組織優化和在乙個嵌入式軟體中的引數的標準約定。開發者使用自己的組合語言也可以使用 eabi 作為與相容的編譯器生成的組合語言的介面。

兩者主要區別是,abi是計算機上的,eabi是嵌入式平台上(如arm,mips等)。

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc

兩個交叉編譯器分別適用於 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架構(對應的編譯器為 arm-linux-gnueabi-gcc )採用的預設值,用fpu計算,但是傳引數用普通暫存器傳,這樣中斷的時候,只需要儲存普通暫存器,中斷負荷小,但是引數需要轉換成浮點的再計算。

hard: armhf架構(對應的編譯器 arm-linux-gnueabihf-gcc )採用的預設值,用fpu計算,傳引數也用fpu中的浮點暫存器傳,省去了轉換,效能最好,但是中斷負荷高。

把以下測試使用的c檔案內容儲存成 mfloat.c:

#include

int main(void)

1、使用 arm-linux-gnueabihf-gcc 編譯,使用「-v」選項以獲取更詳細的資訊:

# arm-linux-gnueabihf-gcc -v mfloat.c

collect_gcc_options=』-v』 『-march=armv7-a』 『-mfloat-abi=hard』 『-mfpu=vfpv3-d16′ 『-mthumb』

-mfloat-abi=hard

可看出使用hard硬體浮點模式。

2、使用 arm-linux-gnueabi-gcc 編譯:

# arm-linux-gnueabi-gcc -v mfloat.c

collect_gcc_options=』-v』 『-march=armv7-a』 『-mfloat-abi=softfp』 『-mfpu=vfpv3-d16′ 『-mthumb』

-mfloat-abi=softfp

可看出使用softfp模式。

交叉編譯工具

參考資料

交叉編譯工具鏈

交叉編譯工具鏈 交叉編譯 就是在一種平台上編譯出能執行在體系結構不同的另一種平台上的程式 比如在pc平台 x86 cpu 上編譯出能執行在以arm為核心的cpu平台上的程式,編譯得到的程式在x86 cpu平台上是不能執行的,必須放到arm cpu平台上才能執行,雖然兩個平台用的都是linux系統 交...

arm交叉編譯工具詳解

保險起見,原文內容如下 命名規則例項 codesourcery abi 和 eabi arm linux gnueabi gcc 和 arm linux gnueabihf gcc 交叉編譯工具鏈的命名規則為 arch vendor os gnu eabi 根據對作業系統的支援與否,arm gcc可...

arm交叉編譯工具搭建

操作平台 rel5.1 交叉編譯工具版本 arm linux gcc 4.3.2 1 進入root使用者命令列模式,執行su root 3 進入工具鏈放置的目錄下,cd mnt hgfs linux 解壓工具鏈 tar xzvf arm linux gcc 4.3.2.tgz c 注 c 選項作用是...