LFS(Linux From Scratch)構建過程全記錄(五):交叉工具鏈的構建

寫在前面

本文將詳細講述如何構建工具鏈

前置知識

在LFS-BOOK中,我們需要學習一些關於“交叉編譯”的內容,詳見書本

 

安裝Binutils-2.39

我們cd到sources文件夾中,使用以下命令解壓

tar -xf binutils-2.39.tar.xz

注意:該命令將會直接把原壓縮包刪除

解壓需要一定的時間,解壓完成後我們可以看到一個新的文件夾

隨後,我們進入binutils-2.39文件夾中,在文件夾下創建編譯目錄,並進入編譯目錄中

我們進行編譯的配置,輸入以下的配置信息到終端中

../configure --prefix=$LFS/tools \
 --with-sysroot=$LFS \
 --target=$LFS_TGT \
 --disable-nls \
 --enable-gprofng=no \
 --disable-werror

輸入完成後回車,我們會看到它有一些檢查的信息,這些我們可以忽略

隨後,我們輸入指令

make

此時,將會開始編譯

編譯完成後,我們需要安裝編譯結果,輸入以下指令

make install

 此時,該工具已經被構建完畢

 

安裝GCC-12.2.0 - 步驟1

警告:LFS-BOOK 11.2中,對本處的描述不夠清晰,未寫明GCC需要先解壓

(感謝這篇文章Linux From Scratch(LFS11.0)交叉編譯臨時工具 - GCC-11.2.0 - 第二遍 - 墨天輪 (modb.pro)

還有這位強者Lucifer三思而後行 - 個人中心 - 騰訊雲開發者社區-騰訊雲 (tencent.com)

我們首先需要解壓GCC-12.2.0,解壓方法和Binutils的安裝類似,指令如下

敲指令前請確保當前目錄爲$LFS/sources
tar -xf gcc-12.2.0.tar.xz

由於GCC的構建需要GMP,MPFR和MPC三個包,因此我們需要對這三個包進行操作

首先,我們返回$LFS/sources目錄下

我們需要對着三個包分別進行解壓和重命名,命令如下:

tar -xf mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc

並將三個文件夾都拖入gcc-12.2.0這個文件夾中,如圖所示

接着,確保當前目錄爲$LFS/sources/gcc-12.2.0中

如果你的電腦指令集爲x86_64,那麼你需要在終端中輸入以下的代碼,該代碼將設置64位庫的默認目錄名爲" lib "

case $(uname -m) in
 x86_64)
 sed -e '/m64=/s/lib64/lib/' \
 -i.orig gcc/config/i386/t-linux64
 ;;
esac

和Binutils的構造一樣,我們構建一個build文件夾,並cd

mkdir -v build
cd build

輸入以下配置文件

../configure \
 --target=$LFS_TGT \
 --prefix=$LFS/tools \
 --with-glibc-version=2.36 \
 --with-sysroot=$LFS \
 --with-newlib \
 --without-headers \
 --disable-nls \
 --disable-shared \
 --disable-multilib \
 --disable-decimal-float \
 --disable-threads \
 --disable-libatomic \
 --disable-libgomp \
 --disable-libquadmath \
 --disable-libssp \
 --disable-libvtv \
 --disable-libstdcxx \
 --enable-languages=c,c++

完成後,我們輸入make即可開始編譯

該步編譯耗時非常久,需要耐心等待

完成編譯後,輸入make install

注意:完成GCC編譯後,有部分文件尚未更新,需要進行更新

保持自己在$LFS/sources/gcc-12.2.0/build目錄下,輸入以下指令

cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
 `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h

至此,我們完成了GCC的編譯

 

安裝Linux-5.19.2 API Headers

我們首先解壓linux-5.19.2壓縮包,然後cd進其對應的文件夾

隨後,運行以下命令,準備編譯內核:

make mrproper

該命令確保內核源代碼樹絕對乾淨,內核開發組建議在每次編譯內核前運行該命令

隨後,運行以下代碼構建

make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

 

安裝Gllibc-2.36

和前文一樣,我們進行解壓和cd

完成後,創建一個符合LSB的符號鏈接,指令如下

case $(uname -m) in
 i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
 ;;
 x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
 ;;
esac

隨後,安裝補丁,指令如下

patch -Np1 -i ../glibc-2.36-fhs-1.patch

我們可以看到輸出如下所示

隨後,開始構建build文件夾,和前文方法相同

接着,我們需確保ldconfig和sln實用程序安裝到/usr/sbin,指令如下

echo "rootsbindir=/usr/sbin" > configparms

和前文一樣,我們準備configure,指令如下:

../configure \
 --prefix=/usr \
 --host=$LFS_TGT \
 --build=$(../scripts/config.guess) \
 --enable-kernel=3.2 \
 --with-headers=$LFS/usr/include \
 libc_cv_slibdir=/usr/lib

隨後,我們就可以make了

完成make後,注意make install的指令有一定的不同,指令如下

make DESTDIR=$LFS install

設置的原因爲:幾乎所有包都使用DESTDIR make變量來定義應該安裝包的位置。如果未設置,則默認爲根(/)目錄。這裏我們指定包安裝在$LFS中

 

階段檢查一

我們已經安裝若干個工具,爲確保安裝的工具順利工作,我們將進行一系列正確性測試

我們可以輸出以下命令進行測試

echo 'int main(){}' | gcc -xc -
readelf -l a.out | grep ld-linux

該部分代碼的含義是,新建一個最基礎的c源文件,並進行編譯

如果編譯器工作正常,它將不會有錯誤信息的提示,輸出應和下文內容一致

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

如果這部村存在錯誤,則說明之前構建的Binutils,GCC或Glibc中的一個存在問題

測試完畢後,運行此代碼以清除編譯出的可執行文件a.out

rm -v a.out

至此,我們完成了上述插件的測試

 

現在我們的跨工具鏈已經完成,最後完成limits.h頭文件的安裝,運行以下指令

$LFS/tools/libexec/gcc/$LFS_TGT/12.2.0/install-tools/mkheaders

 

Libstdc++ from GCC-12.2.0安裝

Libstdc++在gcc源碼中,所以需要重新解壓gcc並編譯Libstdc++。

注意:老的gcc摻了其他東西,因此我們需要刪掉老的gcc包並重新

Libstdc++編譯配置如下:

../libstdc++-v3/configure \
 --host=$LFS_TGT \
 --build=$(../config.guess) \
 --prefix=/usr \
 --disable-multilib \
 --disable-nls \
 --disable-libstdcxx-pch \
 --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0

然後make

完成make後,執行make DESTDIR=$LFS install(和之前一致)

完成install後,需刪除libtool歸檔文件,因爲它會影響交叉編譯,刪除命令如下:

rm -v $LFS/usr/lib/lib{stdc++,stdc++fs,supc++}.la

至此,我們完成Libstdc++的安裝

 

至此,LFS-BOOK中第五章的“交叉工具鏈構建”已全部完成

VMware中的快照已更新

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章