《深度探索Linux系統:系統構建和原理解析》筆記——2.工具鏈構建
1. 什麼是交叉編譯工具鏈
編譯工具的 --host 為 宿主機, --target為 目標機
2. 交叉編譯工具鏈包括哪些
包括 預編譯器,編譯器,彙編器,連結器,庫。
具體有如下包:
GCC : 構建gcc和編譯器cc1,
Binutils: 構建 預編譯器ccp,彙編器as,連結器ld,其他工具如 objdump, strip等
C庫
gcc不是編譯器,而是指揮編譯連結的驅動程式。
crti.o crtn.o ... 目標檔案中有 啟動程式,終止程式等,由GCC提供
C庫,C庫是必須的,因為應用程式不應該直接訪問核心服務,C庫對核心服務進行封裝,讓應用使用。C庫有多種版本,如Glibc uClibc等。
3. 構建交叉編譯工具的順序
先構建 Binutils,因為其沒有任何依賴。
再構建 freestanding env 模式的 GCC,因為完整功能的GCC依賴Glibc,而Glibc又依賴 gcc(target為目標主機),所以必須先構建 freestanding env模式的GCC,這個模式 的 gcc 不依賴 Glibc,且能讓 --target為 目標主機。
再構建 Glibc,使用 freestanding env 的gcc進行構建
最後構建完整功能的 gcc。
3.1 準備工作
groupadd vita
useradd -m -s /bin/bash -g vita vita
-m : 建立使用者目錄
在 /etc/sudoers.d目錄下建立vita檔案,內容為
vita ALL=(ALL) NOPASSWD: ALL
建立工作目錄
mkdir sources cross-tool cross-gcc-tmp sysroot
chown -R vita.vita /vita
在.bashrc中定義環境變數
# 禁止中文環境 unset LANG # 宿主資訊 export HOST=i686-redhat-linux-gnu # 構建程式的主機資訊 export BUILD=$HOST # 編譯程式輸出的 程式的執行主機 資訊 export TARGET=i686-none-linux-gnu export CROSS_TOOL=/home/vita/cross-tool export CROSS_GCC_TMP=/home/vita/cross-gcc-tmp # 編譯程式 尋找標頭檔案和庫的系統根目錄 export SYSROOT=/home/vita/sysroot # 確保 CROSS_TMP在 CROSS_GCC_TMP前,如此當 完整功能的gcc安裝後,能直接使用完整功能的gcc PATH=$CROSS_TOOL/bin:$CROSS_GCC_TMP/bin:/sbin:/usr/sbin:$PATH
3.2 編譯Binutils
cd build
tar xf ../sources/binutils.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.23.1/configure --prefix=$SYSROOT --target=$TARGET --with-sysroot=$SYSROOT
make && make install
--prefix : 配置安裝目錄
--target : 編譯工具的輸出 檔案 在 target環境執行
--with-sysroot : 構建的工具 使用 $SYSROOT 為 系統根目錄,所以在這個目錄找 標頭檔案 和 連結檔案。
3.3 編譯 freestanding env gcc
tar xf sources/gcc-xx.tar.bz2
gcc需要一些數學庫,下載庫
cd gcc-xx
./contrib/down_pre
mkdir gcc-build
cd gcc-build