1、什么是crosstool-ng
crosstool-ng,全稱是crosstool Next Generation,即下一代crosstool,即crosstool的升級版。那么什么是crosstool 呢?crosstool,是個交叉編譯器的制作工具。交叉編譯器簡單的說可以理解為在X86電腦上編譯處ARM的運行程序。更詳細的介紹可以參考《構建嵌入式LINUX系統》的第四章。
2、制作交叉編譯工具鏈的步驟
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命令測試。就出現相應的說明就說明安裝成功了。
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平台
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查看架構。
進入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程序。未完待續。