交叉編譯工具鏈的制作
前言及准備
本筆記制作的交叉編譯工具已通過簡單驗證,對初次有需求需要搭建交叉工具鏈有一定的指導意義,制作工具鏈比較耗時,需做好花費一整天時間的准備。
資料學習鏈接
linux工具、軟件安裝的基本步驟:
下載,配置,編譯,安裝
crosstool-ng下載
或使用指令
新建 arm-linux-tool 文件夾用於制作工具鏈
mkdir arm-linux-tool
cd arm-linux-tool
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2
tar -xvjf crosstool-ng-1.23.0.tar.bz2
新建
mkdir crosstool-build crosstool-install src
一、安裝crosstool-ng
1.編譯依賴
sudo apt-get install gperf flex bison texinfo gawk libtool automake libncurses5-dev g++ help2man
gperf是完美哈希函數生成器;
bison和flex是用來生成語法和詞法分析器;
texinfo和man類似,用來讀取幫助文檔;
automake是幫助生成Makefile的工具;
libtool幫助在編譯過程中處理庫的依賴關系,自動搜索路徑;
gawk是linux下用於文本處理和模式匹配的工具;
2.配置、安裝
cd crosstool-ng-1.23.0
./configure --prefix /home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/
配置過程中出現的缺少安裝項通過安裝解決
配置正常生成 makefile 后,進行編譯安裝
make
make install
驗證安裝是否成功
在 crosstool-install/bin 目錄下執行 ./ct-ng -v
為了后面使用方便,配置臨時環境變量
export PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/bin/
二、配置交叉編譯工具鏈
對於常見的架構,比如arm,mips,powerpc等等,都有了很多的,已經幫我驗證過,可以正常編譯的示例配置了,所以我們接下來,主要就是:
搞懂自己借用哪個配置,然后調用默認配置,然后再確認一下配置,根據自己的情況去改一改,就差不多,就配置好了。
下面介紹,如何去配置crosstool-ng的主要的兩種情況:
- 如果已有同樣(類似的)配置,那么直接拿過來用即可
- 如果沒有需要的配置,則找到一個最為接近的配置,借用后,再去修改為自己所要的配置
在 crosstool-ng 源碼的 crosstool-ng-1.23.0/samples 目錄下已經提供了很多配置模板,我們基於模板修改。
拷貝 crosstool-ng-1.23.0/samples/arm-unknown-linux-gnueabi 到 crosstool-build文件夾;
復制 arm-unknown-linux-gnueabi/crosstool.config 為 .config用來配置
cd crosstool-build
cp arm-unknown-linux-gnueabi/crosstool.config .config
ct-ng menuconfig
(1)Paths and misc options 配置選項
設定源碼包路徑和交叉編譯器的安裝路徑
- 源碼包路徑:設置Paths and misc options下的Local tarballs directory為 /home/wangh/workspace/wh_tools/arm-linux-tool/src
- 交叉編譯器的安裝路徑:設置Paths and misc options下的Prefix directory為 /home/wangh/workspace/wh_tools/arm-linux-tool/x-tools/${CT_TARGET}
(2)Target options 配置選項
1.修改交叉編譯器針對的架構
-
設置Target options下的Architecture level為 armv7-a
-
設置Target options下的Emit assembly for CPU為 cortex-a7
-
設置Target options下的Tune for CPU為 cortex-a7
iMX6ULL配置如下:
-
Architecture level=CT_ARCH_ARCH=-march=armv7-a //架構
-
Emit assembly for CPU=CT_ARCH_CPU=-mcpu=cortex //家族
-
Tune for CPU=CT_ARCH_TUNE=-mtune=cortex-a7 //內核
iMX283配置如下:
- Architecture level=CT_ARCH_ARCH=-march=armv5tej //架構
- Emit assembly for CPU=CT_ARCH_CPU=-mcpu=arm9e //家族
- Tune for CPU=CT_ARCH_TUNE=-mtune=arm926ej-s //內核
2.設置支持硬件 FPU,iMX6ULL 支持硬件浮點運算單元
(3)Toolchain options 配置選項
1.修改 Tuple’s vendor string 廠商字符串 如:arm-fsl-linux-gnueabi-
我們用 ht 或自定義,這里我用 wh 標識
- 修改 Tuple’s alias ,給交叉編譯工具起別名,這樣會給每個工具創建一個軟連接
這樣 arm-wh-linux-guneabihf-gcc 就可以使用 arm-linux-gcc 表示。
(4)Operating System 配置選項
1.使用本地內核,配置內核版本與路徑
修改 Path to custom source, tarball or directory 為/home/wangh/Tools/linux-4.1.15
修改自定義內核版本為 4.1.15
(5)C-library 配置選項
其他先保持默認。
做完上述配置工作后,選擇save然后退出。
執行 ct-ng build
整個編譯過程時間比較長,crosstool-ng 會自動下載相應的包(沒有配置本地內核的還需要下載內核文件),然后解壓、配置、編譯、鏈接,但有個別包在自動下載過程中會出錯,如:libelf-0.8.13,這個時候就需要手動下載,然后放到之前設置的 arm-linux-tool/src 目錄下,重新運行 ct-ng build 即可。
編譯出錯
-
Building binutils 時出現 g++: internal compiler error: Killed (program cc1plus) 錯誤,經查詢可能是內存不足, 臨時使用交換分區來解決。
sudo dd if=/dev/zero of=/swapfile bs=64M count=16 sudo mkswap /swapfile sudo swapon /swapfile
編譯完成之后釋放資源
sudo swapoff /swapfile sudo rm /swapfile
-
其他不太好查詢的錯誤可查看目錄下的編譯日志,會有出錯的具體原因,如配置Emit assembly for CPU為 cortex 導致編譯gcc時出現無法識別的錯誤,修改為cortex-a7即可。
整個編譯過程時間較長,視電腦配置,配置好12小時,差一點的34小時,當然編譯出錯再次編譯也會浪費大量時間,做好需要花費1~2天時間的准備。
編譯完成
經過幾次修改和漫長的編譯終於編譯完成。
配置環境變量
echo "PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/x-tools/arm-wh-linux-gnueabihf/bin" >> ~/.bashrc
source ~/.bashrc
安裝成功測試
arm-linux-gcc --version
三、工具編譯測試
1.寫一個簡單的C程序, hello.c
#include<stdio.h>
#include<stdlib.h>
static char buff[256];
static char* string;
int main (void)
{
string = buff;
printf("Please input a string: ");
fgets(string, 256, stdin);
printf("Your string is: %s", string);
return 0;
}
2.使用配置的工具鏈交叉編譯
arm-linux-gcc hello.c -o hello
3.nfs共享到目標板上執行