OnWorks Linux 和 Windows 在线工作站

商标

工作站免费在线托管

<上一页 | 内容 | 下一页>

5.2. 工具链技术说明‌

本节解释了整体构建方法背后的一些基本原理和技术细节。 不需要立即理解本节中的所有内容。 执行实际构建后,大部分信息将更加清晰。 此部分可以在过程中随时参考。

图片

第 5 章的总体目标是生成一个临时区域,其中包含一组可以与主机系统隔离的已知良好工具。 通过使用 chroot,其余章节中的命令将包含在该环境中,确保目标 LFS 系统的构建干净、无故障。 构建过程旨在最大限度地降低新读者的风险,同时提供最大的教育价值。


备注

在继续之前,请注意工作平台的名称,通常称为目标三元组。 确定目标三元组名称的一种简单方法是运行 配置猜测 许多软件包的源代码附带的脚本。 解压 Binutils 源代码并运行脚本: ./config.猜测 并注意输出。 例如,对于 32 位 Intel 处理器,输出将为 i686-pc-linux-gnu. 在 64 位系统上,它将是 x86_64-pc-linux-gnu.

还要注意平台的动态链接器的名称,通常称为动态加载器(不要与标准链接器混淆 ld 那是 Binutils 的一部分)。 Glibc 提供的动态链接器查找并加载程序所需的共享库,准备程序运行,然后运行它。 32 位 Intel 机器的动态链接器的名称将是 ld-linux.so.2 (ld-linux-x86-64.so.2 对于 64 位系统)。 确定动态链接器名称的一种可靠方法是通过运行以下命令检查来自主机系统的随机二进制文件: 阅读 -l | grep 解释器 并注意输出。 涵盖所有平台的权威参考在 shlib 版本 Glibc 源代码树根目录中的文件。

备注

在继续之前,请注意工作平台的名称,通常称为目标三元组。 确定目标三元组名称的一种简单方法是运行 配置猜测 许多软件包的源代码附带的脚本。 解压 Binutils 源代码并运行脚本: ./config.猜测 并注意输出。 例如,对于 32 位 Intel 处理器,输出将为 i686-pc-linux-gnu. 在 64 位系统上,它将是 x86_64-pc-linux-gnu.

还要注意平台的动态链接器的名称,通常称为动态加载器(不要与标准链接器混淆 ld 那是 Binutils 的一部分)。 Glibc 提供的动态链接器查找并加载程序所需的共享库,准备程序运行,然后运行它。 32 位 Intel 机器的动态链接器的名称将是 ld-linux.so.2 (ld-linux-x86-64.so.2 对于 64 位系统)。 确定动态链接器名称的一种可靠方法是通过运行以下命令检查来自主机系统的随机二进制文件: 阅读 -l | grep 解释器 并注意输出。 涵盖所有平台的权威参考在 shlib 版本 Glibc 源代码树根目录中的文件。

第 5 章构建方法如何工作的一些关键技术点:

• 稍微调整工作平台的名称,通过更改“供应商”字段目标三元组的方式 LFS_TGT 变量,确保第一次构建 Binutils 和 GCC 生成兼容的交叉链接器和交叉编译器。 交叉链接器和交叉编译器将生成与当前硬件兼容的二进制文件,而不是为其他架构生成二进制文件。


• 临时库是交叉编译的。 由于交叉编译器本质上不能依赖来自其主机系统的任何东西,因此该方法通过减少来自主机的头文件或库被合并到新工具中的机会来消除对目标系统的潜在污染。 交叉编译还允许在支持 32 位的硬件上构建 64 位和 64 位库。

• 仔细操作 GCC 源代码告诉编译器将使用哪个目标动态链接器。

Binutils 首先安装,因为 配置 GCC 和 Glibc 的运行对汇编器和链接器执行各种功能测试,以确定启用或禁用哪些软件功能。 这比人们一开始意识到的更重要。 错误配置的 GCC 或 Glibc 可能会导致工具链轻微损坏,这种损坏的影响可能要到整个发行版的构建接近尾声时才会显现出来。 测试套件失败通常会在执行太多额外工作之前突出显示此错误。

Binutils 将其汇编器和链接器安装在两个位置, /工具/垃圾箱 /工具/$LFS_TGT/bin. 一个位置的工具与另一个位置硬链接。 链接器的一个重要方面是它的库搜索顺序。 详细信息可从 ld 通过传递它 --详细 旗帜。 例如,一个 ld --详细 | 搜索 将说明当前的搜索路径及其顺序。 它显示了哪些文件被链接 ld 通过编译一个虚拟程序并传递 --详细 切换到链接器。 例如, gcc dummy.c -Wl,--verbose 2>&1

| grep successed 将显示链接期间成功打开的所有文件。

下一个安装的包是 GCC。 在运行期间可以看到的示例 配置 是:


检查要使用的汇编程序... /tools/i686-lfs-linux-gnu/bin/as 检查要使用的链接器... /tools/i686-lfs-linux-gnu/bin/ld

检查要使用的汇编程序... /tools/i686-lfs-linux-gnu/bin/as 检查要使用的链接器... /tools/i686-lfs-linux-gnu/bin/ld

由于上述原因,这很重要。 它还演示了 GCC 的配置脚本不会搜索 PATH 目录来查找要使用的工具。 但在实际操作中 GCC 本身,不一定使用相同的搜索路径。 找出哪个标准链接器 GCC 将使用,运行: gcc-print-prog-name=ld.

详细信息可从 GCC 通过传递它 -v 编译虚拟程序时的命令行选项。 例如, gcc -v 虚拟.c 将显示有关预处理器、编译和组装阶段的详细信息,包括 GCC包括搜索路径及其顺序。

接下来安装的是经过消毒的 Linux API 标头。 这些允许标准 C 库 (Glibc) 与 Linux 内核将提供的功能接口。

下一个安装的包是 Glibc。 构建 Glibc 最重要的考虑因素是编译器、二进制工具和内核头文件。 编译器通常不是问题,因为 Glibc 将始终使用与 - 主持人 参数传递给它的配置脚本; 例如在我们的例子中,编译器将是 i686-lfs-linux-gnu-gcc. 二进制工具和内核头文件可能有点复杂。 因此,不要冒险并使用可用的配置开关来强制执行正确的选择。 运行后 配置, 检查内容 配置文件 文件中 glibc 构建 所有重要细节的目录。 注意使用 CC="i686-lfs-gnu-gcc" 控制使用哪些二进制工具以及使用 -nostdinc -ISystem. 用于控制编译器的包含搜索路径的标志。 这些项目突出了 Glibc 包的一个重要方面——它在构建机制方面非常自给自足,并且通常不依赖于工具链默认值。

在 Binutils 的第二次传递期间,我们能够利用 --with-lib-路径 配置开关控制 ld的库搜索路径。

对于 GCC 的第二遍,其源代码也需要修改以告诉 GCC 使用新的动态链接器。 如果不这样做将导致 GCC 程序本身具有来自主机系统的动态链接器的名称 / lib目录 目录嵌入到它们中,这将破坏远离主机的目标。 从这一点开始,核心工具链是自包含和自托管的。 第 5 章的其余包都是针对新的 Glibc 构建的 /工具.


在第 6 章中进入 chroot 环境后,第一个要安装的主要包是 Glibc,因为它具有上述自给自足的特性。 一旦这个 Glibc 安装到 在/ usr,我们将执行工具链默认值的快速转换,然后继续构建目标 LFS 系统的其余部分。


OnWorks 的顶级操作系统云计算: