天天看點

交叉編譯工具鍊的制作交叉編譯工具鍊的制作

交叉編譯工具鍊的制作

前言及準備

本筆記制作的交叉編譯工具已認證簡單驗證,對初次有需求需要搭建交叉工具鍊有一定的指導意義,制作工具鍊比較耗時,需做好花費一整天時間的準備。

資料學習連結

crosstool-ng詳解

linux工具、軟體安裝的基本步驟:

下載下傳,配置,編譯,安裝

crosstool-ng下載下傳

crosstool-ng-1.23.0.tar.bz2

或使用指令

建立 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 辨別

交叉編譯工具鍊的制作交叉編譯工具鍊的制作
  1. 修改 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 即可。

編譯出錯

  1. 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
               
  2. 其他不太好查詢的錯誤可檢視目錄下的編譯日志,會有出錯的具體原因,如配置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共享到目标闆上執行

交叉編譯工具鍊的制作交叉編譯工具鍊的制作

繼續閱讀