1. 程式人生 > 其它 >《深度探索Linux系統:系統構建和原理解析》筆記——2.工具鏈構建

《深度探索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