准備工作
這個過程其實是很簡單的。 之所以經常會失敗, 大部分都是因為configure時使用的配置選項不正確導致編譯出錯。所以,出錯時最好的解決辦法是根據提示,把相關配置選項的真正含義搞明白,然後再做取捨;如果一味地去網上搜索別人的辦法,即使解決了錯誤,自己也還是知其然而不知其所以然。
工作環境:普通的x86電腦,Ubuntu 9.04操作系統,目標是制作ARM交叉編譯工具鏈,支持EABI和Soft Float。
使用的軟件包版本:Binutils-2.19.1; GCC-4.4.0; Glibc-2.9; Linux-2.6.29; gmp-4.3.0; mpfr-2.4.1; 所需的軟件包大都可以從中國科技大學的鏡像服務器上下載:http://oss.ustc.edu.cn, 教育網內速度應該是很快的。
工作目錄結構:
package 存放下載到的原始文件壓縮包
patch 存放一些補丁文件
source 存放解壓縮後的源代碼,
build 存放編譯過程中生成的所有文件,不在源代碼目錄下編譯是為了避免對源代碼文件夾造成影響
result 存放編譯後生成的最終結果放在此處
幾個環境變量:
PACKAGE_DIR=${PWD}/package
BUILD_DIR=${PWD}/build
PATCH_DIR=${PWD}/patch
RESULT_DIR=${PWD}/result
SOURCE_DIR=${PWD}/source
TARGET_PREFIX=${RESULT_DIR}/${TARGET}
HOST=i686-pc-linux-gnu
TARGET=arm-hwlee-linux-gnueabi
注意這裡的arm-*-linux-gnueabi,(中間的星號部分是任意的),這種寫法是固定格式的,可以在Binutils軟件包的README文件裡找到格式說明。其中gnueabi表示創建的交叉編譯器支持EABI。
什麼是EABI?簡單的說,就是C/C++源代碼編譯成匯編碼的約定,如符號表的生成,全局變量的初始化等。我們可以把ABI理解為一套規則,這套規則一般包括定義了以下內容: 1.應用程序如何發出系統調用來trap到內核態。 2.如何使用機器的寄存器。比如,RISC處理器的ABI就要規定用那個通用寄存器來作stack pointer和frame pointer。3.規定如何進行procedure call。這是從網上找來的別人的介紹,等我把它搞透徹了再通過一些實驗來具體說明。
使用shell腳本自動創建目錄、下載軟件包、自動解壓和打補丁, 本文中所敘述的所有步驟都寫在Shell腳本中。