一、什麼是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;工具
進入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程序。未完待續。