交叉編譯就是在乙個平台上生成另乙個平台上的可執行
二進位制。這兩個平台可以是不同的體系結構和不同的作業系統。例如,在嵌入式系統
c/c++
開發過程中,常常需要在
x86/x86_64
主機上編譯出可執行程式,給
arm或
powerpc
體系結構的裝置執行。
交叉編譯的兩個概念:
宿主機(host
):編譯程式
的平台,一般是基於
x86的
pc機,通常也稱為主機。
目標機(target
):使用者開發軟體所執行的裝置,通常都是非
x86平台。
host
編譯生成的
可執行程式
在target
上執行。
交叉編譯工具鏈是乙個由編譯器、鏈結器和直譯器組成的綜合開發環境,主要由binutils
、gcc
和glibc
三個部分組成,安裝在宿主機
host
上。其中,
binutils
主要生成一些輔助工具;
gcc是用來生成交叉編譯器,而
glibc
主要提供使用者程式所依賴的一些基本函式庫。
1.1
建立工作目錄
構建交叉編譯工具時,建議使用非root
使用者,防止出現覆蓋問題。可以通過
useradd -d
命令先新增普通使用者如
hlz,然後執行:
cd $home
mkdir ppc
cd ppc
mkdir tools sources
cd sources
1.2
binutils-2.19.tar.bz2 #
glibc-2.9.tar.bz2 #
glibc-linuxthreads-2.5.tar.bz2 #
gcc-4.4.2.tar.bz2 # ,
linux-2.6.31.tar.bz2
# kernel headers
gmp-4.3.1.tar.bz2
# gcc
mpfr-2.4.1.tar.bz2
# gcc
1.3
設定環境變數
export target=powerpc-linux
export tools=~/ppc/tools
export sources=~/ppc/sources
export lc_all=c
cd $sources
tar -jxvf linux-2.6.31.tar.bz2
cd linux-2.6.31
#把核心標頭檔案安裝到$tools/$target/usr/include
中。make arch=powerpc install_hdr_path=$tools/$target/usr header_install
ls -p $tools/$target/usr/include
# 檢查安裝結果
asm/ asm-generic/ drm/ linux/ mtd/ rdmal/scsi/ sound/ video/ xem/
安裝binutils工具,該binutils用於目標平台。
cd $sources
tar -jxvf binutils-2.19.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.19/configure --prefix=$tools --target=$target
make
make install
ls -p $tools
# 檢查安裝結果
bin/ info/ lib/ man/ powerpc-linux/ share/
在第一次安裝gcc
之前,先安裝兩個依賴庫
gmp和
mpfr
:tar -jxvf gmp-4.3.1.tar.bz2
cd gmp-4.3.1
./configure --enable-cxx --enable-mpbsd--prefix=/usr
# 預設為/usr/local
make
make check
sudo make install
tar -jxvf mpfr-2.4.1.tar.bz2
./configure --enable-thread-safe --prefix=/usr
make
make check
sudo make install
如安裝正常,則進行gcc
第一次安裝:
tar -jxvf gcc-4.4.2.tar.bz2
mkdir gcc-bootstrap-build
cd gcc-bootstrap-build
../gcc-4.4.2/configure --target=$target --prefix=$tools --disable-nls --disable-shared --disable-mutilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --without-headers --enable-language=c --with-newlib
make all-gcc
make install-gcc
#把編譯好的gcc
安裝到$tools/bin
和/$target/bin #
編譯安裝gcc
庫make all-target-libgcc
#把gcc
庫檔案及標頭檔案安裝到
$tools/lib/$target/$gcc_version/
目錄下。
make install-target-libgcc
使用上面新安裝的gcc編譯,該glibc用於目標平台。
cd $sources
tar -jxvf glibc-2.9.tar.bz2
tar -jxvf glibc-linuxthreads-2.5.tar.bz2 --directory=glibc-2.9
編譯前修改glibc-2.9
的makeconfig:
修改:gnulib := -lgcc $(libgcc_eh)
static-gnulib := -lgcc -lgcc_eh $(libunwind)
為:gnulib := -lgcc
static-gnulib := -lgcc
mkdir glibc_build
cd glibc_build
cc=$tools/bin/$-gcc ../glibc-2.9/configure --host=$target --build=$(../glibc-2.9/scripts/config.guess) --with-headers=$tools/$target/usr/include --with-binutils=$tools/$target/powerpc-linux/bin --disable-profile --enable-add-ons libv_cv_forced_unwind=yes libc_cv_c_cleanup=yes --includedir=/usr/include --prefix=/usr/ --enable-add-ons=linuxthreads --enable-add-ons=nptl
make
make install_root=$tools/$target/prefix="" install
vi $tools/$target/lib/libc.so
修改:group( /lib/libc.so.6/lib/libc_nonshared.a) 為:
group( libc.so.6 libc_nonshared.a)
目標平台的glibc庫已完備,接下來編譯乙個完整的gcc交叉工具鏈。
cd $sources
mkdir gcc-full-build
cd gcc-full-build
../gcc-4.4.2/configure --target=$target --host=$(../gcc-4.4.2/config.guess) --prefix=$tools --with-headers=$tools/$target/usr/include --enable-language=c,c++ --disable-libgomp
make all
make install
首次構建交叉編譯工具鏈過程中,難免因系統環境、開源軟體版本等差異出現各種各樣的問題,具體問題需要各位耐心地具體分析,多搜尋多查閱。只有盡可能多地發現並解決問題,才能不斷的領悟,並在後續製作交叉編譯工具鏈的過程中少走彎路。
製作交叉編譯工具鏈 1
交叉編譯環境是由編譯器 聯結器和直譯器組合成的綜合開發環境。交叉編譯工具主要包括針對目標系統的編譯器gcc 目標系統的二進位制工具binutils 目標系統的標準c庫glibc和目標系統的linux核心標頭檔案 安裝上述檔案,並設定變數 prefix 指定可執行程式的安裝路徑 執行configure...
製作交叉編譯工具鏈 2
解壓crosstool ng tar jxvf crosstool ng 1.23.0 檢查依賴,完成依賴檢查後生成makefile configure prefix home forlinx crosstool install 編譯,編譯成功後進行安裝 make make install 新增環境...
用Crosstool 製作交叉編譯工具鏈
解壓到downloads資料夾 apt get install bison apt get install flex 二 進入解壓後的crosstool vim demo arm softflaot.sh 修改如下兩行 tarballs dir home downloads 所需安裝包儲存目錄 re...