《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.10. GCC-4.9.2 - 第2遍

简介:

GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。

大概编译时间: 7.7 SBU
所需磁盘空间: 2.6 GB

5.10.1. 安装 GCC

我们第一次编译 GCC 的时候安装了一些内部系统头文件。其中的一个 limits.h 会反过来包括对应的系统头文件 limits.h, 在我们的例子中,是 /tools/include/limits.h。但是,第一次编译 gcc 的时候 /tools/include/limits.h 并不存在,因此 GCC 安装的内部头文件只是部分的自包含文件, 并不包括系统头文件的扩展功能。这足以编译临时 libc,但是这次编译 GCC 要求完整的内部头文件。 使用和正常情况下 GCC 编译系统使用的相同的命令创建一个完整版本的内部头文件:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

再一次更改 GCC 的默认动态链接器的位置,使用安装在 /tools 的那个。

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

和第一次编译 GCC 一样,它要求 GMP、MPFR 和 MPC 软件包。 解压 tar 包并把它们重名为到所需的文件夹名称:

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

再次创建独立的编译文件夹:

mkdir -v ../gcc-build
cd ../gcc-build

在开始编译 GCC 之前,记住取消所有会覆盖默认优化选项的环境变量。

准备编译 GCC:

CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../gcc-4.9.2/configure                             \
    --prefix=/tools                                \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --enable-languages=c,c++                       \
    --disable-libstdcxx-pch                        \
    --disable-multilib                             \
    --disable-bootstrap                            \
    --disable-libgomp

新配置选项的含义:

--enable-languages=c,c++

这个选项确保编译了 C 和 C++ 编译器。

--disable-libstdcxx-pch

不为 libstdc++ 编译预编译的头文件(PCH)。这会花费很多时间,却对我们没有用处。

--disable-bootstrap

对于原生编译的 GCC,默认是做一个“引导”构建。这不仅会编译 GCC,而且会多次编译。 它用第一次编译的程序去第二次编译自己,然后同样进行第三次。 比较第二次和第三次迭代确保它可以完美复制自身。这也意味着已经成功编译。 但是,LFS 的构建方法能够提供一个稳定的编译器,而不需要每次都重新引导。

编译软件包:

make

安装软件包:

make install

作为画龙点睛,这里创建一个符号链接。很多程序和脚本执行 cc 而不是 gcc来保持程序的通用性, 因而在所有并不总是安装了 GNU C 编译器的 Unix 类型的系统上都可以使用。 运行 cc 使得系统管理员不用考虑要安装那种 C 编译器:

ln -sv gcc /tools/bin/cc
[Caution]

注意

到了这里,必须停下来确认新工具链的基本功能(编译和链接)都是像预期的那样正常工作。运行下面的命令进行全面的检查:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

如果一切工作正常的话,这里应该没有错误,最后一个命令的输出形式会是:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]
AI 代码解读

注意 /tools/lib、或者 64 位机器的 /tools/lib64 会以动态链接器的前缀出现。

如果输出不是像上面那样或者根本就没有输出,那么可能某些地方出错了。 调查并回溯这些步骤,找出问题所在并改正它。在继续之前必须解决这个问题。 首先,使用gcc 而不是 cc 再次进行全面的检查。 如果能运行,就丢失了 /tools/bin/cc 符号链接。 像上面介绍的那样新建符号链接。下一步,确认 PATH 是正常的。 这能通过运行 echo $PATH 检验,验证 /tools/bin 在列表的前面。如果 PATH 是错误的, 这意味着你可能不是以 lfs 用户的身份登录或者前面 4.4,“设置环境”中某些地方出现了错误。

一旦一切都顺利,清理测试文件:

rm -v dummy.c a.out

该软件包的详细信息在 Section 6.17.2, “GCC 软件包内容”


创建者:Gerard Beekmans

编辑者:Matthew Burgess 和 Armin K.

翻译团队:LCTT

译者/校对:ictlyh,dongfengweixiao

原文链接

目录
打赏
0
0
0
0
16429
分享
相关文章
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
68 24
Linux系统之su命令的基本使用
Linux系统之su命令的基本使用
41 1
Linux系统之su命令的基本使用
|
20天前
|
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
101 27
|
24天前
|
Linux系统ext4磁盘扩容实践指南
这个过程就像是给你的房子建一个新的储物间。你需要先找到空地(创建新的分区),然后建造储物间(格式化为ext4文件系统),最后将储物间添加到你的房子中(将新的分区添加到文件系统中)。完成这些步骤后,你就有了一个更大的储物空间。
103 10
|
26天前
|
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
71 0
调试技巧 - 用Linux命令排查Java问题
总的来说,使用Linux命令来排查Java问题,需要一定的实践经验和理论知识。然而,只要我们愿意花时间深入了解这些工具,我们就能够熟练地使用它们来分析和解决问题。此外,这些工具只是帮助我们定位问题,真正解决问题需要我们对Java和JVM有深入的理解,并能够读懂和分析代码。
45 13
|
17天前
|
linux常用命令详细说明以及案例
本文介绍了Linux中几个常用的命令及其用法,包括:`ls`(列出目录内容)、`cd`(切换目录)、`mkdir`(创建目录)、`rm -p`(删除目录及内容)和`mv`(移动或重命名文件/目录)。每个命令都配有详细说明、语法格式、常见选项及实用案例,帮助用户更好地理解和使用这些基础命令。内容源自[linux常用命令详细说明以及案例](https://linux.ciilii.com/show/news-285.html)。
|
17天前
|
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
116 56
|
20天前
|
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
66 19
|
1月前
|
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat > filename` 创建新文件,`cat >> filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
57 5
Linux 常用文件查看命令