本節書摘來異步社群《嵌入式linux開發實用教程》一書中的第1章,第1.3節,作者:朱兆祺 ,李強 ,袁晉蓉 ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
嵌入式linux開發實用教程
平常我們做的編譯叫本地編譯,也就是在目前平台編譯,編譯得到的程式也是在本地執行。相對而言的交叉編譯指的是在一個平台上生成另一個平台的可執行代碼。
常見的交叉編譯有以下3種。
在windows pc上,利用ads(arm 開發環境),使用armcc編譯器,編譯出針對arm cpu的可執行代碼。
在linux pc上,利用arm-linux-gcc編譯器,編譯出針對linux arm平台的可執行代碼。
在windows pc上,利用cygwin環境,運作arm-elf-gcc編譯器,編譯出針對arm cpu的可執行代碼。
由于一般嵌入式開發系統的存儲大小是有限的,通常都要在性能優越的pc上建立一個用于目标機的交叉編譯工具鍊,用該交叉編譯工具鍊在pc上編譯目标機上要運作的程式,比如在pc平台(x86 cpu)上編譯出能運作在以arm為核心的cpu平台上的程式。要生成在目标機上運作的程式,必須要用交叉編譯工具鍊完成。交叉編譯工具鍊是一個由編譯器、連接配接器和解釋器組成的綜合開發環境,交叉編譯工具鍊主要由binutils、gcc和glibc 3個部分組成。有時出于減小libc 庫大小的考慮,也可以用别的 c 庫來代替 glibc,例如 uclibc、dietlibc 和 newlib。建立交叉編譯工具鍊是一個相當複雜的過程,如果不想自己經曆複雜繁瑣的編譯過程,網上有一些編譯好的可用的交叉編譯工具鍊可以下載下傳,但就以學習為目的來說,讀者有必要學習自己制作一個交叉編譯工具鍊。本節通過具體的執行個體講述基于arm的嵌入式linux交叉編譯工具鍊的制作過程。
制作arm-linux交叉編譯工具鍊的一般通過crosstool工具或者crosstool_ng,前者使用友善,但是制作會受到一些限制,使用crosstool最多隻能編譯gcc 4.1.1、glibc 2.x的版本。crosstool-ng是新的用來建立交叉工具鍊的工具,它是crosstool的替換者,crosstool_ng有更好的定制性,并且一直保持着更新,對新版本的編譯工具鍊的支援比較好,當然也帶來了一些麻煩,它并不是下載下傳下來就可以使用的,必須先配置安裝。我們這裡選用crosstool_ng來制作我們的編譯鍊。
1.安裝crosstool_ng
在crosstool_ng官網上下載下傳最新版本。
正在解析主機 crosstool-ng.org... 140.211.15.107
正在連接配接 crosstool-ng.org|140.211.15.107|:80... 已連接配接。
已發出 http 請求,正在等待回應... 200 ok
長度: 1884219 (1.8m) [application/x-bzip]
正在儲存至: “crosstool-ng-1.18.0.tar.bz2”
100%[======================================>] 1,884,219 223k/s 花時 8.8s
下載下傳源碼成功之後解壓源碼:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools$ tar jxvf crosstool-ng-1.18.0.tar.bz2
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools$ ls
crosstool-ng-1.18.0 crosstool-ng-1.18.0.tar.bz2<code>`</code>
考慮到後續将要使用到的各種目錄,在這裡先建立好後續所需目錄。
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools$ sudo apt-get install sed bash cut dpkg-dev patch texinfom4 libtool statwebsvn tar gzip bzip2 lzmabison flex texinfo automake libtool patchcvs cvsd gawk–y
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0$ ./configure --prefix /home/zhuzhaoqi/arm-linux-tools/crosstool-install<code>`</code>
在安裝過程中,提示如下錯誤:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0$ sudo apt-get install bison<code>`</code>
安裝完成之後,再次進行配置:
……
checking for bison... bison
checking for flex... no
configure: error: missing required tool: flex<code>`</code>
提示缺失flex這個軟體,進行安裝:
又一次提示錯誤:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0$ sudo apt-get install gperf<code>`</code>
安裝完成之後,再一次進行配置:
checking for flex... flex
checking for gperf... gperf
checking for makeinfo... no
configure: error: missing required tool: makeinfo<code>`</code>
缺失makeinfo軟體,進行安裝,如果安裝的是makeinfo,則會有如下提示:
這次的配置成功,如果讀者操作還會報錯的話,依照上面方法找出其根源進行改正即可。成功配置之後會自動建立我們需要的makefile檔案。
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0$ make install<code>`</code>
成功安裝之後,可以看到已經安裝到指定的目錄下,最後輸出這麼一句話:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0$ sudo echo "path=$path:/home/zhuzhaoqi/arm-linux-tools/crosstool-install/bin" >> ~/.bashrc<code>`</code>
執行使其生效:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0/samples$ ls
alphaev56-unknown-linux-gnu mips64el-n64-linux-uclibc
alphaev67-unknown-linux-gnu mips-ar2315-linux-gnu
arm-bare_newlib_cortex_m3_nommu-eabi mipsel-sde-elf
arm-cortex_a15-linux-gnueabi mipsel-unknown-linux-gnu
arm-cortex_a8-linux-gnueabi mips-malta-linux-gnu
arm-davinci-linux-gnueabi mips-unknown-elf
armeb-unknown-eabi mips-unknown-linux-uclibc
armeb-unknown-linux-gnueabi powerpc-405-linux-gnu
armeb-unknown-linux-uclibcgnueabi powerpc64-unknown-linux-gnu
arm-unknown-eabi powerpc-860-linux-gnu
arm-unknown-linux-gnueabi powerpc-e300c3-linux-gnu
arm-unknown-linux-uclibcgnueabi powerpc-e500v2-linux-gnuspe
armv6-rpi-linux-gnueabi powerpc-unknown-linux-gnu
avr32-unknown-none powerpc-unknown-linux-uclibc
bfin-unknown-linux-uclibc powerpc-unknown_nofpu-linux-gnu
i586-geode-linux-uclibc s390-ibm-linux-gnu
i586-mingw32msvc,i686-none-linux-gnu s390x-ibm-linux-gnu
i686-nptl-linux-gnu samples.mk
i686-unknown-mingw32 sh4-unknown-linux-gnu
m68k-unknown-elf x86_64-unknown-linux-gnu
m68k-unknown-uclinux-uclibc x86_64-unknown-linux-uclibc
mips64el-n32-linux-uclibc x86_64-unknown-mingw32<code>`</code>
裡面有很多預設配置,有arm、avr32、mips、powerpc等硬體平台,而arm平台有如下幾個:
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-ng-1.18.0/samples$ cp -r arm-unknown-linux-gnueabi/ ../../crosstool-build/
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-build$ ls
arm-unknown-linux-gnueabi<code>`</code>
将預設配置檔案拷貝到工作目錄(crosstool-build)下并改名為.config,因為預設的配置檔案為.config,完成之後可以加載需要的配置。
zhuzhaoqi@zhuzhaoqi-desktop:~/arm-linux-tools/crosstool-build$ ct-ng menuconfig
ln config
mkdir config.gen
in config.gen/arch.in
in config.gen/kernel.in
in config.gen/cc.in
in config.gen/binutils.in
in config.gen/libc.in
in config.gen/debug.in
conf config/config.in
進入配置界面,如圖1.1所示。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLjJDZyUDO4IjYwIWMkVjZzczNiFTN3YTNlhDOjhjYzEjYwIDNwMjMw8CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
下面設定源碼目錄和安裝目錄,這需要讀者依據自己實際設定的情況來進行配置。
第一步,設定源碼包路徑和交叉編譯器的安裝路徑。
target architecture(arm) 這個不用管,已經是arm了。
default instruction set mode (arm) 這個也不管,也已經是arm了。
architecture level()需要進行修改。<code>`</code>
通過查找資料,這個應該是指令集的架構,對于s3c6410 arm1176jzf-s核心使用的是armv6zk架構,就選armv6zk。那麼,具體都支援哪些架構呢?可以用man gcc來查詢,搜尋arm,再搜尋-march=就可以找到本gcc支援的處理器核心清單了:
-mcpu=name
this specifies the name of the target arm processor. gcc uses this
name to determine what kind of instructions it can emit when
generating assembly code. permissible names are: arm2, arm250,
arm3, arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d,
arm7dm, arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c,
arm7100, arm720, arm7500, arm7500fe, arm7tdmi,arm7tdmi-s, arm710t,
arm720t, arm740t, strongarm, strongarm110, strongarm1100,
strongarm1110, arm8, arm810, arm9, arm9e, arm920, arm920t, arm922t,
arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi,
arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e, arm1022e,
arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp, arm1156t2-s,
arm1176jz-s, arm1176jzf-s, cortex-a8, cortex-a9, cortex-r4,
cortex-r4f, cortex-m3, cortex-m1, xscale, iwmmxt, iwmmxt2, ep9312.<code>`</code>
這樣看簡單一些了,如果是s3c2410/s3c2440就選arm920t,如果是s3c6410就選arm1176jzf-s。
tune for cpu() ,對應的gcc描述如下:
c compiler --->
additional supported languages:
[ ] java //不用這個編譯器來編譯java<code>`</code>
當然,如果讀者需要用它來編譯java那就不用去除。
其他選項采用預設設定存盤然後退出,這樣就配置完了。
zhuzhaoqi@zhuzhaoqi-desktop:~/u-boot/makefile/shellfunction$ arm-linux-gcc -v
using built-in specs.
target: arm-none-linux-gnueabi
configured with: /scratch/julian/2009q3-respin-linux-lite/src/gcc-4.4/configure --build= i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind- tables|mabi=|ffreestanding|nostdlib:;:-funwind-tables} %{o2:%{!fno-remove-local-statics: -fremove-local-statics}} %{o:%{o|o0|o1|o2|os:;:%{!fno-remove-local-statics: -fremove-local- statics}}}' --enable-languages=c,c++ --enable-shared --disable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='sourcery g++ lite 2009q3-67' --with-bugurl=https: //support.codesourcery.com/gnutoolchain/ --disable-nls --prefix=/opt/codesourcery --with- sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/julian/ 2009q3-respin-linux-lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/julian/ 2009q3-respin-linux-lite/obj/host-libs-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/julian/2009q3-respin-linux-lite/obj/host-libs-2009q3-67-arm-none- linux-gnueabi-i686-pc-linux-gnu/usr --with-ppl=/scratch/julian/2009q3-respin-linux-lite/ obj/ host-libs-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-host-libstdcxx='-static- libgcc -wl,-bstatic,-lstdc++,-bdynamic -lm' --with-cloog=/scratch/julian/2009q3-respin- linux-lite/obj/host-libs-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/ julian/2009q3-respin-linux-lite/install/arm-none-linux-gnueabi/bin --with-build-time- tools=/scratch/julian/2009q3-respin-linux-lite/install/arm-none-linux-gnueabi/bin
thread model: posix
gcc version 4.4.1 (sourcery g++ lite 2009q3-67)<code>`</code>
筆者建議最好不要在root使用者下進行安裝,否則使用交叉編譯鍊可能會存在權限限制。