交叉編譯工具鏈


在Linux系統下搞嵌入式開發,交叉編譯器那肯定是必備工具。用的場合多了,就會見到各種各樣的編譯工具。

交叉編譯工具鏈概念

image

本地編譯

在當前PC編譯出來的可執行程序,可在當前PC環境中執行。即在當前PC環境下編譯出了相同CPU體系結構的可執行程序。如x86 PC編譯的可執行程序可運行在x86的CPU上。

交叉編譯

交叉編譯,是一個和本地編譯相對應的概念,交叉編譯通俗地講就是一種平台上編譯出的程序能夠運行在不同體系結構的平台上,比如在PC平台(X86 CPU)上編譯出能運行在ARM CPU的程序,

交叉編譯的原因

之所以要有交叉編譯,主要原因是:嵌入式系統中的資源太少。具體的解釋就是:所要運行的目標環境中,各種資源,都相對有限,所以很難進行直接的本地編譯。嵌入式開發板的CPU、RAM、Falsh等硬件資源相對比較緊張,在已經運行了嵌入式Linux的前提下,沒法方便的進行本地編譯。因為編譯,開發,都需要相對比較多的CPU,內存,硬盤等資源,而嵌入式開發上的資源,只夠嵌入式(Linux)系統運行的,沒太多剩余的資源,供你本地編譯。

什么是交叉編譯工具鏈

交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發工具集,交叉編譯工具鏈主要由binutils、gcc和glibc三個部分組成。有時出於減小 libc 庫大小的考慮,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉編譯工具鏈是一個相當復雜的過程,如果不想自己經歷復雜繁瑣的編譯過程,網上有一些編譯好的可用的交叉編譯工具鏈可以下載,當然也可以學習自己制作一個交叉編譯工具鏈。

交叉編譯工具鏈的分類

從授權上,分為免費授權版和付費授權版。
免費版目前有三大主流工具商提供,第一是GNU(提供源碼,自行編譯制作),第二是 Codesourcery,第三是Linora。
收費版有ARM原廠提供的armcc、IAR提供的編譯器等等,因為這些價格都比較昂貴,不適合學習用戶使用,所以不做講述。

交叉編譯工具鏈的命名

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

arch – 體系架構,如ARM,MIPS
vendor – 工具鏈提供商
os – 目標操作系統
eabi – 嵌入式應用二進制接口(Embedded Application Binary Interface)
arch:體系架構,如ARM,MIPS等,表示該編譯器用於編譯哪個目標平台的程序

vendor:工具鏈提供商,即誰制作出來這個交叉編譯器的,vendor的值,貌似是可以自己隨便填寫的;更加通用的做法,是把vendor寫成,體系架構的值,比如arm-cortex_a8-linux-gnueabi中的cortex_a8,就屬於CPU的名字。

os:目標操作系統。即交叉編譯器編譯出來的程序,在什么系統中、環境中運行。而對應的環境或系統,主要有兩種:有OS、無OS。一般用linux表示有操作系統。用none表示裸系統,如編譯一個Uboot,或者是其他一個小程序,運行在無嵌入式Linux的環境。 比如,購買的嵌入式系統開發板,常常附帶一些小程序,比如點亮LED,跑馬燈等程序,就是這種,運行在無OS的環境。

ABI 和 EABI
ABI:二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口。
EABI:嵌入式ABI。嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標准約定。開發者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區別是,ABI是計算機上的,EABI是嵌入式平台上(如ARM,MIPS等)。

實例說明

  1. arm-eabi-gcc:Android ARM 編譯器。

  2. 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庫。

  3. 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 操作系統的會用到

  4. arm-linux-gnueabihf-gcc:是由 Linaro 公司基於GCC推出的的ARM交叉編譯工具。可用於交叉編譯ARM(32位)系統中所有環節的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應用程序。

  5. aarch64-linux-gnu-gcc:是由 Linaro 公司基於GCC推出的的ARM交叉編譯工具。可用於交叉編譯ARMv8 64位目標中的裸機程序、u-boot、Linux kernel、filesystem和App應用程序。

  6. arm-none-elf-gcc:是 Codesourcery 公司(目前已經被Mentor收購)基於GCC推出的的ARM交叉編譯工具。可用於交叉編譯ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。

  7. armcc:ARM 公司推出的編譯工具,功能和 arm-none-eabi 類似,可以編譯裸機程序(u-boot、kernel),但是不能編譯 Linux 應用程序。armcc一般和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的編譯器都是armcc,所以 armcc 編譯器都是收費的。


免責聲明!

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



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