LFS 11.2(Linux From Scratch)构建过程全记录(五):交叉工具链的构建
写在前面
本文将详细讲述如何构建工具链
前置知识
在LFS-BOOK中,我们需要学习一些关于“交叉编译”的内容,详见书本
如果你想提高你的安装速度,你可以查阅本人LFS系列第八章中一些提高效率的Tips,这将帮助你大幅提高包的安装速度。
安装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中的快照已更新