《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


注意

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

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

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

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

注意 /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

原文链接

时间: 2025-01-19 14:26:45

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

《Linux From Scratch》第一部分:介绍 第一章:介绍-1.1 如何构建LFS系统

         LFS 系统需要在一个已经安装好的 Linux 发行版(比如 Debian.OpenMandriva.Fedora 或 OpenSUSE)中构建.这个已有的 Linux 系统(即宿主)作为构建新系统的起始点,提供了必要的程序,包括一个编译器.链接器和 shell.请在安装发行版的过程中选择 "development(开发)"选项以便使用这些开发工具. 除了将一个独立发行版安装到你的电脑上之外,你也可以使用商业发行版的 LiveCD. 本书的第二章描述了如何创建一个的新

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

       这是 Linux From Scratch 手册的 7.7-systemd 版本,发布于2015年3月6日.如果距离这个时间已超过 6 个月,那么应该已经有更新和更好的版本了.要获取的话,请访问这个页面 http://www.linuxfromscratch.org/mirrors.html 里任意一个镜像站点. 下面是本书上一次发布之后的更新列表. 更新日志条目: 2015-03-06 [krejzi] - LFS-7.7-systemd 发布. 2015-03-03 [bdub

《Linux From Scratch》第一部分:介绍 第一章:介绍- 1.5. 帮助

如果在使用本书的过程中有疑问或碰到问题,可以先去看下 FAQ 页面 http://www.linuxfromscratch.org/faq/#generalfaq.那里已经解决了很多经常遇到的问题.如果你的问题在那里找不到答案,可以先尝试找出问题的原因.下面页面里的提示可以提供一些帮你定位问题的帮助:http://www.linuxfromscratch.org/hints/downloads/files/errors.txt. 如果在 FAQ 里找不到你遇到的问题,还可以在这个邮件列表里搜索一

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

1.4.1. FAQ 如果在构建 LFS 系统的过程中遇到任何错误,有任何的疑问,或者认为书中存在拼写错误,请先看一下常见问题列表(FAQ) http://www.linuxfromscratch.org/faq/. 1.4.2. 邮件列表 在服务器 linuxfromscratch.org 上部署了一些用于 LFS 项目开发工作的邮件列表.其中包括了主要开发列表和支持列表,以及一些其它的.如果通过 FAQ 不能解决你遇到的问题,接下来你可以搜索邮件列表: http://www.linuxfro

《Linux From Scratch》第一部分:介绍 第一章:介绍-1.2. 上次发布以来的更新

下面列出了自本书上一次发布之后的一些软件包更新. 更新: Automake 1.15 Bash 4.3.30 Binutils 2.25 Bison 3.0.4 D-Bus-1.8.16 DejaGNU 1.5.2 File 5.22 GCC 4.9.2 Gettext 0.19.4 Glibc 2.21 Grep 2.21 Groff 1.22.3 GRUB 2.02~beta2 IPRoute2 3.19.0 Kmod 19 Libpipeline 1.4.0 Libtool 2.4.6 L

《Linux From Scratch》第三部分:构建LFS系统 第九章:尾声- 9.4. 接下来做什么呢?

         十分感谢你耐心的阅读这本 LFS 书,我们十分期待本书能够为你构建系统带来一点点的帮助. 我猜,你现在一定很开心--LFS 系统已经安装完成.但是,下面该作些什么呢?不用担心,我们早已经帮你准备好以下这些有益的信息了! 维护 定期检查软件的 bug 和安全公告.因为在从源码构建出 LFS 之后,你便应该养成经常去查看这些报告的好习惯.有关查询的去处,网上倒是有一些不错的资源,这里列举几个: CERT (计算机应急响应小组) CERT 有一个邮件列表,专门公示各种操作系统和应用程

《Linux From Scratch》第三部分:构建LFS系统 第九章:尾声- 9.1. 最后的最后

         哈哈,干的很不错!到这里,全新的 LFS 系统就已经安装完成了!我们也很期待你那闪闪发光的定制 Linux 系统呐. 创建一个 systemd 所需的 /etc/os-release 文件: cat > /etc/os-release << "EOF" NAME="Linux From Scratch" VERSION="7.7-systemd" ID=lfs PRETTY_NAME="Linux F

《Linux From Scratch》第四部分:附录- 附录 A. 缩略词和术语

ABI Application Binary Interface 应用程序二进制接口 ALFS Automated Linux From Scratch 自动化 LFS API Application Programming Interface 应用程序设计接口 ASCII American Standard Code for Information Interchange 美国信息交换标准代码 BIOS Basic Input/Output System 基本输入/输出系统 BLFS Beyo

What is Cross Linux From Scratch?

/**************************************************************************** * What is Cross Linux From Scratch? * 说明: * 本文想知道交叉编译的LFS到底是什么. * * 2016-3-23 深圳 南山平山村 曾剑锋 ***************************************************************************/ 参考文章