利用Crosstool-ng製做交叉編譯工具鏈

一、什麼是crosstool-nglinux

crosstool-ng,全稱是crosstool Next Generation,即下一代crosstool,即crosstool的升級版。那麼什麼是crosstool 呢?crosstool,是個交叉編譯器的製做工具。交叉編譯器簡單的說能夠理解爲在X86電腦上編譯處ARM的運行程序。更詳細的介紹能夠參考《構建嵌入式LINUX系統》的第四章。web

二、製做交叉編譯工具鏈的步驟bash

a、從網址 http://crosstool-ng.org/download/crosstool-ng/下載相應版本的crosstool-ng工具,我下載的版本是crosstool-ng-1.20.0.tar.bz2。如有補丁也須要同時下載,網址爲http://crosstool-ng.org/download/crosstool-ng/01-fixes/網絡

b、解壓crosstool-ng-1.20.0.tar.bz2。命令爲tar xjf crosstool-ng-1.20.0.tar.bz2。解壓後獲得一個名爲crosstool-ng-1.20.0的文件夾。輸入命令cd crosstool-ng-1.20.0進入文件夾,若是有興趣能夠看下README文件,它會教你一步步製做交叉編譯工具鏈。另外doc文件夾下有詳細的製做步驟能夠參考。架構

c、配置、編譯安裝crosstool-ng-1.20.0。步驟:進入crosstool-ng-1.20.0文件夾,執行./configure --prefix=/work/tools/crosstool-ng命令配置crosstool-ng-1.20.0,/work/tools/crosstool-ng爲crosstool-ng-1.20.0的安裝路徑。若配置過程當中出現錯誤,通常是缺乏某個程序形成的,缺什麼安裝什麼就能夠了。通常須要安裝的程序爲 sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk。配置成功後執行make命令編譯,而後make install進行安裝。若是後面出現編譯錯誤,再增長相應的包便可。安裝完成後能夠執行export PATH=$PATH:/work/tools/crosstool-ng/bin。把ct-ng命令放到環境變量中,這樣就能夠在任何地方執行ct-ng了。爲了測試是否安裝成功能夠輸入ct-ng --help命令測試。就出現相應的說明就說明安裝成功了。svn

d、配置工具鏈選項。步驟:將crosstool-ng源碼包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷貝到源碼包主目錄下,在源碼包主目錄下執行cp samples/arm-unknown-linux-gnueabi/crosstool.config .config;工具

而後執行:ct-ng menuconfig能夠看到以下的配置畫面
進入Paths and misc options -- →菜單,修改內容以下:
1)、(${HOME}/src) Local tarballs directory # 指定製做編譯器所須要的源碼包的下載存放,能夠修改爲任意位置,請注意權限。如今指定到/work/tools/crosstool-ng-1.20.0/src 下。
2)、(/opt/${CT_TARGET}) Prefix directory # 製做好的編譯器所放置的目錄。如今指定到/work/tools/crosstool-ng_build下。
3)、選擇Debug crosstool-NG,會多出一個子菜單,選中Save intermediate steps,此選項提供一個從上一步錯誤的地方繼續編譯,而不是重新編譯,這樣節約大量的時間。選擇(3)Number of parallel jobs(NEW),這個菜單須要下拉才能看到此項爲增長編譯時的並行進程數,以增長運行速度,加速編譯。

進入target options -- →菜單,修改的內容以下:測試

1)、確認Target Architecture (arm) ---> # 注意看這項是否是ARM平臺flex

2)、ARMv4t 表示編譯出的編譯器支持ARMv4t架構的cpu;ARM920t 爲指定cpu的類型,S3C2440使用的CPU核心爲ARM920t。經過查找資料,這個應該是指令集的架構,對於S3C2410/S3C2440,都ARM920T的核心,架構指令是armv4t,因此,若是要編譯2410/2440的,就選armv4t。以此類推S3C6410 ARM1176JZF-S核心使用的是armv6架構,就選armv6。能夠經過./arm-linux-gcc --target查看架構。ui

進入Toolchain option-- →菜單,修改的內容以下:

1)、Tuple's vendor string指定經銷商的名稱,影響向生成的編譯器的前綴爲arm-andy-Linux-gnueabi;Tuple's alias是生成編譯器別名,可使用arm-linux-gcc簡潔的命令

進入Operating System --->菜單。選擇編譯的內核版本。這裏使用默認的參數

進入Binary utilities --->選擇binutils的源碼包版本號,配置二進制工具。這裏使用默認參數。

C-library --->菜單,選擇glibc庫版本,使用默認參數

C compiler --->菜單選擇GCC版本,選擇默認參數

Debug facilities --->菜單,選擇調試工具版本,默認參數。

Companion libraries --->菜單,編譯工具,GMP是實現任意精度算術運算的軟件包,能夠完成有符號整數、有理數和浮點數的運算。只要計算機的內存知足需求,GMP的運算精度沒有任何限制。MPFR是一個用於高精度浮點運算的C庫。默認參數

接着保存退出。配置完成。

e、下面就能夠開始編譯了,默認狀況下,源碼包會從網絡下載,會佔用比較大的帶寬,下載後總大小在200MB左右,下載好會放到 /work/tools/crosstool-ng-1.20.0/src下。也能夠先從網上下載,大部分軟件能夠在這個清華鏡像下載:https://mirrors.tuna.tsinghua.edu.cn,而後再編譯。也能夠先編譯,若是缺乏相應的包下載不成功,會提示。大體的包列表以下:

binutils-2.22.tar.bz2

cloog-0.18.1.tar.gz

dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz

expat-2.1.0.tar.gz

gcc-4.9.1.tar.bz2

gdb-7.8.tar.gz

glibc-2.19.tar.bz2

gmp-5.1.3.tar.xz

isl-0.12.2.tar.bz2

libelf_0.8.13.orig.tar.gz

linux-3.4.97.tar.gz

ltrace_0.7.3.orig.tar.bz2

mpc-1.0.2.tar.gz

mpfr-3.1.2.tar.xz

ncurses-5.9.tar.gz

strace-4.8.tar.xz

 

f、執行ct-ng build開始編譯,我在編譯過程當中一共遇到兩個問題。

1)、安裝到cross-gdb時,出現configure: error: expat is missing or unusable,expat-2.1.0.tar.gz這個文件是運行build時它本身下載的。解決:sudo apt-get install libexpat1-dev.

2)、解決完問題1後執行ct-ng cross-gdb+能夠接着前面的編譯。又出現了_123136.c:835:15: error: expected ')' before 'int'的錯誤。在網上搜尋答案。解決:export CPPFLAGS="-P"。

 

g、最後編譯成功界面以下,切換到編譯後的路徑/work/tools/crosstool-ng_build/bin。執行./arm-linux-gcc -v。如有信息輸出,說明編譯成功

 

h、測試編譯後的arm程序。未完待續。

相關文章
相關標籤/搜索