交叉編譯工具鏈
交叉編譯
就是在一種平台上編譯出能執行在體系結構不同的另一種平台上的程式
,比如在pc平台(x86 cpu)上編譯出能執行在以arm為核心的cpu平台上的程式,編譯得到的程式在x86 cpu平台上是不能執行的,必須放到arm cpu平台上才能執行,雖然兩個平台用的都是linux系統
。交叉編譯工具鏈是乙個由
編譯器、
聯結器和
直譯器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc三個部分組成。有時出於減小 libc 庫大小的考慮,也可以用別的 c 庫來代替 glibc,例如 uclibc、dietlibc 和 newlib。
從授權上,分為免費授權版和付費授權版。
免費版目前有三大主流工具商提供,第一是gnu(提供原始碼,自行編譯製作),第二是 codesourcery,第三是linora。
收費版有arm原廠提供的armcc、iar提供的編譯器等等,因為這些**都比較昂貴,不適合學習使用者使用,所以不做講述。
交叉編譯工具鏈的命名規則為:arch [-vendor] [-os] [-(gnu)eabi]
根據對作業系統的支援與否,arm gcc可分為支援和不支援作業系統,如
(arm architecture,no vendor,not target an operating system
,complies with the arm eabi(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 作業系統的會用到。
android arm 編譯器。
arm 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程式(u-boot、kernel),但是不能編譯 linux 應用程式。armcc一般和arm開發工具一起,keil mdk、ads、rvds和ds-5中的編譯器都是armcc,所以 armcc 編譯器都是收費的(愛國版除外,呵呵~~)。
arm-none-uclinuxeabi 用於uclinux
,使用glibc。
arm-none-symbianelf 用於symbian
,沒用過,不知道c庫是什麼 。
目前codesourcery已經由
eabi:嵌入式abi。嵌入式應用二進位制介面指定了檔案格式、資料型別、暫存器使用、堆積組織優化和在乙個嵌入式軟體中的引數的標準約定。開發者使用自己的組合語言也可以使用 eabi 作為與相容的編譯器生成的組合語言的介面。
兩者主要區別是,abi是計算機上的,eabi是嵌入式平台上(如arm,mips等)。
兩個交叉編譯器分別適用於 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模式。
交叉編譯器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的區別:
arm-none-linux-gnueabi,arm-none-eabi 與arm-eabi 區別:
what』s the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in ltib?
交叉編譯工具鏈安裝
平台 pc 筆者使用虛擬機器vmware 系統 redhat6 ubuntu 版本 4.3.2 tar xvzf arm linux gcc 4.3.2.tgz c 注意這裡使用的是預設解壓路徑,預設是解壓到 usr local arm目錄下 如果需要制定安裝路徑的,只需要在 c後面跟上具體路徑即可...
交叉編譯工具鏈安裝
平台 pc 筆者使用虛擬機器vmware 系統 redhat6 ubuntu 版本 4.3.2 tar xvzf arm linux gcc 4.3.2.tgz c 注意這裡使用的是預設解壓路徑,預設是解壓到 usr local arm目錄下 如果需要制定安裝路徑的,只需要在 c後面跟上具體路徑即可...
1 1 2 交叉編譯工具鏈
1.arm linux gcc 說明 gcc為常規編譯器,標頭檔案一般存放於 usr local arm lib中 用法舉例 arm linux gcc hello.c o hello arm linux gcc static hello.c o hello 2.arm linux ld 說明 鏈結...