嵌入式arm交叉編譯器

轉自: http://www.veryarm.com/296.html
https://blog.csdn.net/gemdream1/article/details/38636087

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

arch - 體系架構,如ARM,MIPS
vendor - 工具鏈提供商
os - 目標操作系統
eabi - 嵌入式應用二進制接口(Embedded Application Binary Interface)
根據對操作系統的支持與否,ARM GCC可分爲支持和不支持操作系統,如

arm-none-eabi:這個是沒有操作系統的,自然不可能支持那些跟操作系統關係密切的函數,比如fork(2)。他使用的是newlib這個專用於嵌入式系統的C庫。
arm-none-linux-eabi:用於Linux的,使用Glibc。
實例
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用於編譯 ARM 架構的裸機系統(包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應用 Application),一般適合 ARM7、Cortex-M 和 Cortex-R 內核的芯片使用,所以不支持那些跟操作系統關係密切的函數,比如fork(2),他使用的是 newlib 這個專用於嵌入式系統的C庫。

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-xxx 交叉編譯工具的浮點運算非常優秀。一般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庫是什麼 。
ABI 和 EABI
ABI:二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口。

EABI:嵌入式ABI。嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的彙編語言也可以使用 EABI 作爲與兼容的編譯器生成的彙編語言的接口。

兩者主要區別是,ABI是計算機上的,EABI是嵌入式平臺上(如ARM,MIPS等)

其他
-o : 後面接的是輸出文件名(arm-linux-gcc -o hello hello.c)

-v : 可以觀看編譯細節 (arm-linux-gcc -v -o hello hello.c)

-c : 預編譯,編譯和彙編源文件,不做連接 [裸板程序一般先不做連接,最後一起做鏈接](arm-linux-gcc -o hello.o -c hello.c)

-S : 編譯後停止,不進行彙編(arm-linux-gcc -S -o hello.s hello.c)

-E : 預編譯後即頂着,不進行編譯(arm-linux-gcc -E hello.c)

-g : 產生調試信息

-Wall : 打開所有需要注意的警告信息

注:將交叉編譯出的可執行程序放到目標板執行,運行時報 “: no such file or directory”,這是因爲執行該bin程序時,找不到對應的依賴文件(一般是xxx.so)

解決辦法:
1、gcc -static -o test test.c 選項將文件編譯成靜態鏈接程序,這種方式編譯出來的bin文件一般會比較大,好處就是執行時沒有額外的依賴文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章