《嵌入式linux交叉編譯工具鏈課件》由會員分享,可在線閱讀,更多相關(guān)《嵌入式linux交叉編譯工具鏈課件(32頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,嵌入式linux交叉編譯工具鏈,簡介和制作,主要內(nèi)容,交叉編譯工具簡介,交叉編譯工具鏈的制作,一、交叉工編譯工具鏈的簡介什么是交叉編譯,1、什么是交叉編譯?,就是在一個平臺上生成可以在另一個平臺上執(zhí)行的代碼。,采用交叉編譯的主要原因是,多數(shù)嵌入式目標(biāo)機(jī)不能提供足夠的資源供編譯過程使用,因而只好將編譯工作轉(zhuǎn)移到高性能的宿主機(jī)中進(jìn)行。,一、交叉工編譯工具鏈的簡介為什么要使用交叉編譯,為什么要用交叉編譯器?交叉編譯通俗地講就是在一種平臺上編譯出能運(yùn)行在體系結(jié)構(gòu)不同的另一種平臺上的程序,比如在PC平臺(X86 CP
2、U)上編譯出能運(yùn)行在以ARM為內(nèi)核的CPU平臺上的程序,編譯得到的程序在X86 CPU平臺上是不能運(yùn)行的,必須放到ARM CPU平臺上才能運(yùn)行,雖然兩個平臺用的都是Linux系統(tǒng)。,一、交叉工編譯工具鏈的簡介為什么要使用交叉編譯,這種方法在異平臺移植和嵌入式開發(fā)時非常有用。相對與交叉編譯,平常做的編譯叫本地編譯,也就是在當(dāng)前平臺編譯,編譯得到的程序也是在本地執(zhí)行。用來編譯這種跨平臺程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標(biāo)機(jī)上運(yùn)行的程序,必須要用交叉編譯工具鏈來完成。,一、交叉工編譯工具鏈的簡介為什么要使用交叉編譯,在裁減和定制Linux內(nèi)核用于
3、嵌入式系統(tǒng)之前,由于一般嵌入式開發(fā)系統(tǒng)存儲大小有限,通常都要在性能優(yōu)越的PC上建立一個用于目標(biāo)機(jī)的交叉編譯工具鏈,用該交叉編譯工具鏈在PC上編譯目標(biāo)機(jī)上要運(yùn)行的程序。交叉編譯工具鏈?zhǔn)且粋€由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出于減小 libc 庫大小的考慮,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉編譯工具鏈?zhǔn)且粋€相當(dāng)復(fù)雜的過程,如果不想自己經(jīng)歷復(fù)雜繁瑣的編譯過程,網(wǎng)上有一些編譯好的可用的交叉編譯工具鏈可以下載,但就以學(xué)習(xí)為目的來說讀者有必要學(xué)習(xí)自己制
4、作一個交叉編譯工具鏈。,一、交叉工編譯工具鏈的簡介構(gòu)建交叉編譯工具鏈,2、交叉編譯工具鏈,交叉編譯工具鏈主要包括針對目標(biāo)系統(tǒng)的編譯器 gcc、目標(biāo)系統(tǒng)的二進(jìn)制工具binutils、目標(biāo)系統(tǒng)的標(biāo)準(zhǔn)c庫glibc和目標(biāo)系統(tǒng)的 Linux 內(nèi)核頭文件。,一、交叉工編譯工具鏈的簡介構(gòu)建交叉編譯工具鏈,構(gòu)建交叉編譯器的第一個步驟就是確定目標(biāo)平臺。在,GNU,系統(tǒng)中,每個目標(biāo)平臺都有一個明確的格式,這些信息用于在構(gòu)建過程中識別要使用的不同工具的正確版本。因此,當(dāng)在一個特定目標(biāo)機(jī)下運(yùn)行,GCC,時,,GCC,便在目錄路徑中查找包含該目標(biāo)規(guī)范的應(yīng)用程序路徑。,GNU,的目標(biāo)規(guī)范格式為,CPU-PLATFORM
5、-OS,。例如,x86/i386,目標(biāo)機(jī)名為,i686-pc-linux-gnu,。本章的目的是講述建立基于,ARM,平臺的交叉工具鏈,所以目標(biāo)平臺名為,arm-,linux,-gnu,。,二、交叉編譯工具鏈的制作方法,三種方法:,分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法二或方法三構(gòu)建交叉工具鏈。,通過,Crosstool,腳本工具來實(shí)現(xiàn)一次編譯生成交叉編譯工具鏈,該方法相對于方法一要簡單許多,并且出錯的機(jī)會也非常少,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈。,直接
6、通過網(wǎng)上()下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點(diǎn)不用多說,當(dāng)然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因?yàn)楫吘故莿e人構(gòu)建好的,也就是固定的沒有靈活性,所以構(gòu)建所用的庫以及編譯器的版本也許并不適合你要編譯的程序,同時也許會在使用時出現(xiàn)許多莫名的錯誤,建議讀者慎用此方法。,二、交叉編譯工具鏈的制作方法,分步構(gòu)建交叉編譯工具鏈,1、下載所需的源代碼包,安裝包,下載地址,安裝包,下載地址,linux-2.4.20.tar.gz,ftp.kernel.org,glibc-2.3.2.tar.gz,ftp.gnu.org,binutils-2.19.tar.bz2,ftp.gnu.
7、org,glibc-linuxthreads-2.3.2.tar.gz,ftp.gnu.org,gcc-3.3.6.tar.gz,ftp.gnu.org,二、交叉編譯工具鏈的制作方法,分步構(gòu)建交叉編譯工具鏈,工作目錄就是在什么目錄下構(gòu)建交叉工具鏈,目錄的構(gòu)建一般沒有特別的要求,可以根據(jù)個人喜好建立。例如當(dāng)前的用戶定義為jiabing,因此用戶目錄為/home/jiabing,在用戶目錄下首先建立一個工作目錄(armlinux),建立工作目錄的命令行操作如下:,#cd/home/jiabing,#mkdir armlinux,再在這個工作目錄armlinux下建立3個目錄 build-tools
8、、kernel 和tools。具體操作如下:,#cd armlinux,#mkdir build-tools kernel tools,其中各目錄的作用如下。,build-tools 用來存放下載的binutils、gcc、glibc等源代碼和用來編譯這些源代碼的目錄;,kernel 用來存放內(nèi)核源代碼;,tools 用來存放編譯好的交叉編譯工具和庫文件,2、建立工作目錄,二、交叉編譯工具鏈的制作方法,該步驟的目的是為了方便重復(fù)輸入路徑,因?yàn)橹貜?fù)操作每件相同的事情總會讓人覺得很麻煩。聲明以下環(huán)境變量的目的是在之后編譯工具庫的時候會用到,很方便輸入,尤其是可以降低輸錯路徑的風(fēng)險。,#export
9、 PRJROOT=/home/jiabing/armlinux,#export TARGET=arm-linux,#export PREFIX=$PRJROOT/tools,#export TARGET_PREFIX=$PREFIX/$TARGET,#export PATH=$PREFIX/bin:$PATH,注意,用export聲明的變量是臨時的變量,也就是當(dāng)注銷或更換了控制臺,這些環(huán)境變量就消失了,如果還需要使用這些環(huán)境變量就必須重復(fù)export操作,所以有時會很麻煩。值得慶幸的是,環(huán)境變量也可以定義在bashrc文件中,這樣當(dāng)注銷或更換控制臺時,這些變量就一直有效,就不用老是export
10、這些變量了。,分步構(gòu)建交叉編譯工具鏈,3、建立環(huán)境變量,Binutils是GNU工具之一,它包括連接器、匯編器和其他用于目標(biāo)文件和檔案的工具,它是二進(jìn)制代碼的處理維護(hù)工具。安裝Binutils工具包含的程序有addr2line、ar、as、c+filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。,二、交叉編譯工具鏈的制作方法,分步構(gòu)建交叉編譯工具鏈,4、編譯、安裝Binutils,介紹完Binutils工具后,下面將分步介紹安裝binutils-2.15的過
11、程。,首先解壓包,命令如下:,#cd$PRJROOT/build-tools,#tar xjvf,接著配置Binutils工具,建議建立一個新的目錄用來存放配置和編譯文件,這樣可以使源文件和編譯文件獨(dú)立開,具體操作如下:,#cd$PRJROOT/build-tools,#mkdir build-binutils,#cd build-binutils,#./binutils-2.15/configure-target=$TARGET-prefix=$PREFIX,其中選項(xiàng)target的意思是制定生成的是 arm-linux 的工具,-prefix 是指出可執(zhí)行文件安裝的位置。執(zhí)行上述操作會出現(xiàn)很
12、多check信息,最后產(chǎn)生 Makefile 文件。接下來執(zhí)行make和安裝操作,命令如下:,#make,#make install,該編譯過程較慢,需要數(shù)十分鐘,安裝完成后查看/home/mike/armlinux/tools/bin目錄下的文件,如果查看結(jié)果如下,表明此時Binutils工具已經(jīng)安裝結(jié)束。,#ls$PREFIX/bin,arm-linux-addr2line arm-linux-ld arm-linux-ranlib arm-linux-strip,arm-linux-ar arm-linux-nm arm-linux-readelf,arm-linux-as arm-li
13、nux-objcopy arm-linux-size,arm-linux-c+filt arm-linux-objdump arm-linux-strings,5、獲取內(nèi)核頭文件,二、交叉編譯工具鏈的制作方法,編譯器需要通過系統(tǒng)內(nèi)核的頭文件來獲得目標(biāo)平臺所支持的系統(tǒng)函數(shù)調(diào)用所需要的信息。對于Linux內(nèi)核,最好的方法是下載一個合適的內(nèi)核,然后復(fù)制獲得頭文件。需要對內(nèi)核做一個基本的配置來生成正確的頭文件;不過,不需要編譯內(nèi)核。對于本例中的目標(biāo)arm-linux,需要以下步驟。,(1)在kernel目錄下解壓內(nèi)核包,執(zhí)行命令如下:,#cd$PRJROOT/kernel,#tar xvzf,(2)接
14、下來配置編譯內(nèi)核使其生成正確的頭文件,執(zhí)行命令如下:,#cd,#make ARCH=arm CROSS_COMPILE=arm-linux-menuconfig,其中ARCH=arm表示是以 arm為體系結(jié)構(gòu),CROSS_COMPILE=arm-linux-表示是以arm-linux-為前綴的交叉編譯器。也可以用config和 xconfig來代替menuconfig,推薦用make menuconfig,這也是內(nèi)核開發(fā)人員用的最多的配置方法。注意在配置時一定要選擇處理器的類型,這里選擇三星的S3C2410(System Type-ARM System Type-/Samsung S3C241
15、0。配置完退出并保存,檢查一下內(nèi)核目錄中的include/linux/version.h和 include/linux/autoconf.h文件是不是生成了,這是編譯glibc時要用到的,如果version.h 和 autoconf.h 文件存在,說明生成了正確的頭文件。,復(fù)制頭文件到交叉編譯工具鏈的目錄,首先需要在/home/mike/armlinux/tools/arm-linux目錄下建立工具的頭文件目錄inlcude,然后復(fù)制內(nèi)核頭文件到此目錄下,具體操作如下:,#mkdir p$TARGET_PREFIX/include,#cp r$PRJROOT/kernel/linux-2.6.
16、10/include/linux$TARGET_PREFIX/include,#cp r$PRJROOT/kernel/linux-2.6.10/include/asm-arm$TARGET_PREFIX/include/asm,這一步的目的主要是建立arm-linux-gcc工具,注意這個gcc沒有g(shù)libc庫的支持,所以只能用于編譯內(nèi)核、BootLoader等不需要C庫支持的程序,后面創(chuàng)建C庫也要用到這個編譯器,所以創(chuàng)建它主要是為創(chuàng)建C庫做準(zhǔn)備,如果只想編譯內(nèi)核和BootLoader,那么安裝完這個就可以到此結(jié)束。安裝命令如下:,#cd$PRJROOT/build-tools,#tar xvzf,#mkdir build-gcc,#cd,#vi gcc/config/arm/t-linux,由于是第一次安裝ARM交叉編譯工具,沒有支持libc庫的頭文件,所以在gcc/config/arm/t-linux文件中給變量TARGET_LIBGCC2_CFLAGS增加操作參數(shù)選項(xiàng)-Dinhibit_libc-D_gthr_ posix_h來屏蔽使用頭文件,否則一般默認(rèn)會使用/usr/inl