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中的快照已更新

 

posted @ 2022-09-12 16:44  AlphaInf  阅读(2229)  评论(0编辑  收藏  举报