本节解释总体构建方法之中的某些基本原理和技术细节。并不需要立即理解本节中的所有问题。在进行实际构建的过程中,绝大部分的信息将会变得愈加清晰。在该过程中可随时查阅本小节的内容。

第五章的总体目标是生成一个临时的系统,它包含一个已知的较好工具集,该工具集可与宿主系统分离。通过使用 chroot,其余各章中的命令将被包含在此环境中,以保证目标 LFS 系统能够洁净且无故障地生成。该构建过程的设计就是为了使得新读者有最少的风险,同时还能有最好的指导价值。

注意

在继续之前,请留意工作平台的名称,它通常称作目标系统三段式名称。目标系统三段式名称可通过运行脚本 config.guess 简单获得,许多软件的源码包都附带有该脚本(译者注:目标系统三段式名称描述了代码运行的平台,是GNU 构建系统中的一个核心概念,形如 i686-pc-gnu-linux。它包含三个字段:CPU家族/型号的名称(如 i686)、供应商(pc)和操作系统名称(如 gnu-linux)。更详细的信息请参阅 http://wiki.osdev.org/Target_Triplet)。解压 Binutils 源码包,执行其中的脚本:./config.guess 并查看其输出。例如,对于一个现代的 32 位英特尔处理器,其输出很可能为 i686-pc-linux-gnu

还请留意平台的动态链接器的名称,它通常被称为动态加载器(不要与 Binutils 中的标准链接器 ld 混淆)。该动态链接器由 Glibc 提供,它寻找并加载程序所需的共享库,为程序运行作准备,并运行它。对于 32 位英特尔的机器,动态链接器的名称为 ld-linux.so.2。判断动态链接器的一个可靠方法是检查宿主系统中的任意一个二进制文件,执行:readelf -l <二进制文件名> | grep interpreter 且查看其输出。可在 Glibc 源码树的根目录下的 shlib-versions 文件中找到所有平台的权威参考。

下面是第五章构建方法的几个关键技术点:

  • 通过改变 LFS_TGT 变量的目标系统三段式中的 “供应商” 字段,从而稍微调整工作平台的名称,以保证第一遍构建 Binutils 和 GCC 时能够生成兼容的交叉链接器和交叉编译器。此处的交叉链接器和交叉编译器生成的二进制文件与当前的硬件兼容,而不是用于其它的硬件架构。

  • 临时库经交叉编译获得。由于交叉编译原本就不应该依赖于宿主系统,因此,通过降低宿主系统的头文件或库进入新工具的可能性,该方法可去除目标系统的可能污染。交叉编译的方式,还可以在 64 位硬件平台上同时构建出 32 位和 64 位库。

  • 谨慎操作 GCC 源码,以告诉编译器将使用哪个目标系统动态链接器。

Binutils 是首个安装的包,这是因为执行 GCC 和 Glibc 的 configure 时都将进行有关汇编器和链接器的多项特性测试,以判断允许或禁用哪些软件特性。其重要性可能更甚于最初的意识。对 GCC 或 Glibc 的错误配置可能导致工具链出现难以捉摸的问题,可能直到整个构建过程接近尾声时才会显现出这些问题。通常情况下,一次测试套件失败可在你进行太多其它工作前暴露出该错误。

Binutils 将其汇编器和链接器安装在两个位置,即 /tools/bin/tools/$LFS_TGT/bin。一个位置的工具是硬链接到另一个位置的。链接器的一个重要方面是它的库搜索顺序。可给 ld 传递参数 --verbose 获得详细信息。如,ld --verbose | grep SEARCH 可得到当前的搜索路径及其顺序。通过编译一个模拟程序并向链接器传递 --verbose 开关,可显示 ld 都链接了哪些文件。例如,gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded 将显示链接过程中成功打开的所有文件。

下一个安装的包是 GCC。下面是运行 GCC 的 configure 的输出的一个例子:

checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld

基于前述原因,这很重要。它还说明了 GCC 的配置脚本并不会搜索 PATH 目录来寻找使用什么工具。不过,在 gcc 自身的实际运行中,并不需要使用同样的搜索路径。运行:gcc -print-prog-name=ld 可获知 gcc 使用是何种标准链接器(LCTT 译注:gcc -print-prog-name 这个命令是为了显示 gcc 使用的某些内部工具的绝对路径,但事实上,ld 并不是 GCC 的内部工具,因此这条命令实际上没什么用)。

在编译模拟程序时,向 gcc 传递命令行选项 -v 可获得详细信息。例如,gcc -v dummy.c 将显示预处理器、编译和汇编阶段的详细信息,包括 gcc 的 include 搜索路径及其顺序。

下一个安装的包是经过净化的 Linux API 头文件。这些头文件可使得标准 C 库(Glibc)与 Linux 内核提供的特性进行交行交互。

下一个安装的包是 Glibc。构建 Glibc 时,最重要的考量是编译器、二进制工具和内核头文件。由于 Glibc 总是使用传递给它的配置脚本的 --host 参数有关的编译器,如,在我们这个场景中是 i686-lfs-linux-gnu-gcc,因此编译器通常不是一个问题。二进制工具和内核头文件可能会更复杂一些。因此,请谨慎行事并利用可用的配置开关以强制使用正确的选择。configure 运行完毕,目录 glibc-build 下的文件 config.make 包含有所有的重要细节。需要注意的是,CC="i686-lfs-gnu-gcc" 用来控制使用哪个二进制工具,-nostdinc-isystem 标志用来控制编译器的 include 搜索路径。这些条目强调了 Glibc 包的一个重要方面,即其构建机制是非常自给自足的,通常并不依赖默工具链的默认设置。

在第二遍编译 Binutils 过程中,我们能够利用配置开关 --with-lib-path 来控制 ld 的库搜索路径。

第二遍编译 GCC 时,也需要修改其源代码以告诉 GCC 使用新的动态链接器。如果不加修改,将会导致 GCC 自身的程序嵌入来自宿主系统目录 /lib 的动态链接器名称,这将破坏远离宿主系统的目标。正是基于前面的这个出发点,核心工具链是自包含和自托管的。第五章其它的软件包都将在 /tools 中的新 Glibc 的基础上进行构建。

在进入第六章中的 chroot 环境前,将安装的首个主要的软件包是 Glibc,这是因为它天生具有前面提及的自给自足特点。一旦将 Glibc 安装到 /usr 中,我们将快速改变工具链的默认设置,然后继续构建目标 LFS 系统的其余部分。

创建者:Gerard Beekmans

编辑者:Matthew Burgess 和 Armin K.

翻译团队:LCTT

译者/校对:Yuking-net,wxy

原文链接

《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.2 工具链技术备注...相关推荐

  1. 《奔跑吧Linux内核(第二版)》第五章笔记

    Linux内核采用宏内核架构,即操作系统的大部分功能都在内核中实现,比如进程管理.内存管理.进程调度.设备管理等,并且都在特权模式下(内核空间)运行.而与之相反的另一种流行的架构是微内核架构,它把操作 ...

  2. Spring实战 | 第二部分 Web中的Spring(第五章 构建Spring Web应用程序)

    第五章 构建Spring Web应用程序 映射请求到Spring控制器 透明地绑定表单参数 校验表单提交 一.Spring MVC起步 1.跟踪spring MVC的请求 在请求离开浏览器时,会带有用 ...

  3. 《Linux From Scratch》第一部分:介绍 第一章:介绍-1.3. 更新日志

    这是 Linux From Scratch 手册的 7.7-systemd 版本,发布于2015年3月6日.如果距离这个时间已超过 6 个月,那么应该已经有更新和更好的版本了.要获取的话,请访问这个页 ...

  4. 鸟哥的Linux私房菜(基础版)第五章学习笔记

    第五章 启动关机.在线求助与执行命令的方式 学习笔记 首次登入FC图形界面 KDE的简单操作 切换X Window与命令行模式 用命令行登入Linux 在命令行模式执行命令 基础命令操作 重要的热键 ...

  5. 《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.11. Tcl-8.6.3...

    Tcl软件包包含工具命令语言(Tool Command Language)相关程序. 大概编译时间: 0.8 SBU 所需磁盘空间: 67 MB 5.11.1. 安装 Tcl 此软件包和后面三个包(E ...

  6. 《Linux From Scratch》第一部分:介绍 第一章:介绍- 1.4. 资源

    1.4.1. FAQ 如果在构建 LFS 系统的过程中遇到任何错误,有任何的疑问,或者认为书中存在拼写错误,请先看一下常见问题列表(FAQ) http://www.linuxfromscratch.o ...

  7. 《奔跑吧Linux内核(第二版)》第三章笔记

    ARM架构基础知识 ARM公司除了提供处理器IP和配套工具外,主要还定义了一系列的ARM兼容指令集来构建整个ARM的软件生态系统. 到了ARMv7指令集,处理器以Cortex命名,又分成A.R和M系列 ...

  8. 《Docker——容器与容器云》:第五章 构建自己的容器云

    我们在第1章介绍了一个云计算平台应有的层次结构,其中平台即服务层(PaaS)是本书重点着墨描述的.尽管在一些经典PaaS平台中,容器技术已经扮演了一个至关重要的角色,但很遗憾,大部分经典PaaS平台中 ...

  9. Linux鸟哥的私房菜(第五章 文件权限以及目录配置)

    Linux鸟哥的私房菜 使用组和群组 User group others 文件属性 -rw-r–r-- 1 -(档案类型)rwx(档案拥有者权限{可读可写可执行)rwx(群组权限可读可写可执行)-其他 ...

最新文章

  1. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...
  2. maven 批量docker_Spring Boot 整合 docker
  3. P4597 序列sequence
  4. ThinkPHP5跨控制器调用
  5. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
  6. CJOJ 2171 火车站开饭店(树型动态规划)
  7. 用maven profile实现环境配置切换
  8. drools的可升级读写锁探究
  9. 云计算---openstack基础构架以及服务方式详解
  10. 首尾相接数组求子数组最大和
  11. And Design:拓荒笔记——Form表单
  12. 互联网躺平学 ,从后端到前端有多吃香?
  13. 如何用代码表白——matlab绘制玫瑰、爱心和I LOVE YOU
  14. 红帽linux系统安装指导
  15. 阿里云E-HPC+i4p大内存实例,加速寻因生物单细胞数据分析效率
  16. 英语数字表达方式大全
  17. Win7 64b的VS2015 如何使用nmake成功编译detour express 3.0-error2202 警告被视为错误 - 没有生成“object”文件
  18. Tailscale组成局域网(以文明6联机为例)
  19. pdf编辑软件哪个好用?这个办法值得一试
  20. 【C语言】已知三角形三边长,求三角形面积

热门文章

  1. vi/vim使用教程
  2. blob转成json js_javascript – 文件API – Blob到JSON
  3. 用python批量创建docker_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3...
  4. python 单行读取文件_python – 在使用for循环读取文件时跳过一行
  5. linux 7 pxe,CentOS 7.6 PXE方式安装和配置
  6. visio交换机图标_分享 | 华为交换机开局配置一本通,弱电新人学习!
  7. python echo(msg) 字符串_[宜配屋]听图阁
  8. django和flask用MD5加密密码
  9. 大学学习论坛 需求分析报告.菜鸟版.多喷.看看问题所在
  10. session.merge 缓存不更新_这几个缓存更新的设计你都知道吗?