寫在前面
本文將詳細講述如何構建工具鏈
前置知識
在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中的快照已更新