核心編譯 沒有規則可製作目標 交叉編譯工具鏈簡介

2021-10-25 12:57:04 字數 2914 閱讀 5835

,積跬步,至千里

嵌入式開發過程中經常會涉及交叉編譯,那麼什麼是交叉編譯,為什麼需要交叉編譯,在這篇文章中我們一起來梳理下。

在回答這個問題之前,先弄明白兩個概念:

之所以要有交叉編譯,主要原因是:

編譯過程包括了預處理、編譯、彙編、鏈結等功能。既然有不同的子功能,那每個子功能都是乙個單獨的工具來實現,它們合在一起形成了乙個完整的工具集。同時編譯過程又是乙個有先後順序的流程,它必然牽涉到工具的使用順序,每個工具按照先後關係串聯在一起,這就形成了乙個鏈式結構。因此,交叉編譯鏈就是為了編譯跨平台體系結構的程式**而形成的由多個子工具構成的一套完整的工具集。

通常的交叉編譯工具鏈都是基於gcc/clang的,大都具有類似如下的結構:

/home/toolchains_sdkdir

lib

include

每個工具鏈都有對應的include/lib目錄,用於放置一些系統庫和標頭檔案,例如libc,stdc++等,而bin目錄下放置的就是編譯工具鏈一系列工具。例如:

arm-linux-armeabi-ararm-linux-armeabi-asarm-linux-armeabi-c++arm-linux-armeabi-cpparm-linux-armeabi-g++arm-linux-armeabi-gccarm-linux-armeabi-ldarm-linux-armeabi-nmarm-linux-armeabi-strip

最簡化的編譯工具鏈一般由binutils + gcc + glibc + kernel-header組成。

binutils是gnu工具之一,它包括鏈結器、彙編器和其他用於目標檔案和檔案的工具,它是二進位制**的處理維護工具。(參考: binutils工具包含的子程式如下:

gcc編譯器,每次安裝的gcc只能針對乙個架構,如果要多個架構輸出,那就要裝多個gcc,所以編譯工具鏈裡面會有乙個gcc。

glibc,工具鏈中還要包含乙個最基本的目標架構的c庫,有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uclibc、dietlibc和newlib等。

目標系統的核心標頭檔案。編譯器需要通過系統核心的標頭檔案來獲得目標平台所支援的系統函式呼叫所需要的資訊。因為gcc、binutils不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上c庫和核心標頭檔案需要目標架構的東西而不能用本機本地架構的資料,所以乙個交叉編譯工具鏈就是針對目標架構準備的單獨安裝單獨使用的binutils + gcc + glibc + kernel-header的集合了。

交叉編譯器的(字首)的名字的命名規則是:

arch [-vendor] [-os] [-(gnu)eabi]

根據對作業系統的支援與否,arm gcc可分為支援和不支援作業系統,例如:

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 作業系統的會用到。

arm-eabi-gccandroid arm 編譯器。

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

arm-none-uclinuxeabi-gccarm-none-symbianelf-gccarm-none-uclinuxeabiarm-none-uclinuxeabi用於uclinux,使用glibc。arm-none-symbianelf用於symbian。

arm-linux-gnueabi-gccarm-linux-gnueabihf-gcc兩個交叉編譯器分別適用於armel和armhf兩個不同的架構,armel和armhf這兩種架構在對待浮點運算採取了不同的策略(有fpu的arm才能支援這兩種浮點運算策略)。其實這兩個交叉編譯器只不過是gcc的選項-mfloat-abi的預設值不同。gcc的選項-mfloat-abi有三種值soft、softfp、hard(其中後兩者都要求arm裡有fpu浮點運算單元,soft與後兩者是相容的,但softfp和hard兩種模式互不相容):

(以上內容整理自網路,侵刪)

交叉編譯工具鏈製作

交叉編譯就是在乙個平台上生成另乙個平台上的可執行 二進位制。這兩個平台可以是不同的體系結構和不同的作業系統。例如,在嵌入式系統 c c 開發過程中,常常需要在 x86 x86 64 主機上編譯出可執行程式,給 arm或 powerpc 體系結構的裝置執行。交叉編譯的兩個概念 宿主機 host 編譯程...

通過crosstool製作交叉編譯工具

網上有很多相關資料,我來補充一些細節吧!主要是為了編譯uboot,消除softfloat問題,不得不自己製作。1 以root登陸,或者通過sudo root進入。2 建立目錄 opt crosstool 並修改並修改其owner。是因為此crosstool不能以root安裝,而須以username安...

製作自己的交叉編譯工具

在linux下建立乙個目錄用於存放crosstool 例如 mkdir home work crosstool cp crosstool 0.43.tar.gz home work crosstool cd home work crosstool tar jxvf crosstool 0.43.ta...