# 6.12\. GCC-4.0.3
GCC 软件包包含 GNU 编译器,其中有 C 和 C++ 编译器。
**预计编译时间:** 22 SBU (含测试套件)**所需磁盘空间:** 566 MB (含测试套件)
## 6.12.1\. 安装 GCC
使用一个 `sed` 命令来禁止 GCC 安装它自己的 `libiberty.a` 。我们将使用 Binutils 附带的 `libiberty.a` 来代替:
```
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
```
在[节 5.4, "GCC-4.0.3 - 第一遍"](../chapter05/gcc-pass1.html "5.4\. GCC-4.0.3 - 第一遍") 中应用的 bootstrap 编译中,编译器会有 `-fomit-frame-pointer` 的标志。非bootstrap编译默认是忽略这个标志的,可以应用下面的`sed` 命令来确保编译的可靠性。
```
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
```
`fixincludes` 脚本偶尔会因为修改系统的头文件而出错。因为GCC-4.0.3 和 Glibc-2.3.6 是不需要修改的,运行下面的命令可以避免 `fixincludes` 脚本运行:
```
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
```
GCC 中提供了一个 `gccbug` 脚本,会在编译时侦测 mktemp 是否存在,并且在测试中加强代码。这将会导致脚本使用一些不算很随机的名字来命名临时文件。因为我们后面会安装 mktemp ,这里我们就模仿它的存在:
```
sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
```
GCC 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
```
mkdir -v ../gcc-build
cd ../gcc-build
```
为编译 GCC 做准备:
```
../gcc-4.0.3/configure --prefix=/usr \
--libexecdir=/usr/lib --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=c,c++
```
编译软件包:
```
make
```
### 重要
本节的GCC测试套件很重要。在任何情况下都不要省略这一步。
运行测试套件,但遇到错误不停止(你还记得那些老是出错的测试吧):
```
make -k check
```
要查看测试单元的测试结果,可以运行:
```
../gcc-4.0.3/contrib/test_summary
```
如果只想看概要,可以把输出通过管道传递给 **`grep -A7 Summ`** 。
结果可以跟 [_http://www.linuxfromscratch.org/lfs/build-logs/6.2/_](http://www.linuxfromscratch.org/lfs/build-logs/6.2/) 的进行比较。
一些预想不到的错误总是无法避免的。虽然GCC的开发者经常留意这些问题,但是有些还是没有得到解决。通常,`libmudflap` 测试尤其被认为是有问题的(这是一个bug,参见[_http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003_](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003))。 除非测试结果给上面URL的有很多不同,一般是可以安全继续的。
安装软件包:
```
make install
```
有的软件包希望 C PreProcessor(预处理器)安装在 `/lib` 目录下,为了满足它们的要求,我们创建如下符号链接:
```
ln -sv ../usr/bin/cpp /lib
```
许多软件包使用 `cc` 作为 C 编译器的名字,为了满足它们的要求,创建如下符号链接:
```
ln -sv gcc /usr/bin/cc
```
现在,我们的最终工具链已经形成了,我们需要做的就是确保编译、链接按照我们希望的完成。我们可以通过本章前面的简册方法来实现:
```
echo 'main(){}' > dummy.c
cc dummy.c -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
```
如果所有的都工作正常,就不会有错误,并且命令的输出应该是(允许不同平台的动态链接器的名称不同):
```
[Requesting program interpreter: /lib/ld-linux.so.2]
```
现在确保我们使用正确的 startfiles:
```
grep -o '/usr/lib.*/crt[1in].* .*' dummy.log
```
如果所有的都工作正常,就不会有错误,并且命令的输出应该是:
```
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crtn.o succeeded
```
接下来,确认新的链接器被应用到了正确的搜索路径中:
```
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
```
如果所有的都工作正常,就不会有错误,并且命令的输出应该是:
```
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
```
现在,确保我们正在使用正确的 libc :
```
grep "/lib/libc.so.6 " dummy.log
```
如果所有的都工作正常,就不会有错误,并且命令的输出应该是
```
attempt to open /lib/libc.so.6 succeeded
```
最后,确保 GCC 正在使用正确的动态链接器:
```
grep found dummy.log
```
如果所有的都工作正常,就不会有错误,并且命令的输出应该是(允许不同平台的动态链接器的名称不同):
```
found ld-linux.so.2 at /lib/ld-linux.so.2
```
如果输出不是像上面那样或者根本没有输出,那么就有大问题了。返回并检查前面的操作,找出问题,并改正过来。最有可能的原因是上面修正 specs 文件时出错。任何一个问题都需要在继续之前解决掉。
一旦工具都工作正常,清理测试文件:
```
rm -v dummy.c a.out dummy.log
```
## 6.12.2\. GCC 的内容
**安装的程序:** c++, cc(→gcc), cpp, g++, gcc, gccbug, gcov**安装的库:** libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.{a,so}, libsupc++.a
### 简要描述
| | |
| --- | --- |
| `cc` | C 编译器 |
| `cpp` | C 预处理器。编译器用它来将 #include 和 #define 这类声明在源文件中展开。 |
| `c++` | C++ 编译器 |
| `g++` | C++ 编译器 |
| `gcc` | C 编译器 |
| `gccbug` | 一个shell脚本,帮助创建有价值的 bug 报告。 |
| `gcov` | 覆盖测试工具,用来分析在程序的哪里做优化的效果最好。 |
| `libgcc` | `gcc` 的运行时库 |
| `libstdc++` | 准 C++ 库,包含许多常用的函数。 |
| `libsupc++` | 为 C++ 语言提供支持的库函数。 |
- Linux From Scratch
- 序言
- i. 前言
- ii. 目标读者
- iii. 先决条件
- iv. 对宿主系统的要求
- v. 排版约定
- vi. 本书的组织结构
- vii. 勘误表
- I. 简介
- 1. 简介
- 1.1. 如何构建一个 LFS 系统?
- 1.2. 与上一版本有何不同?
- 1.3. 更新日志
- 1.4. 资源
- 1.5. 帮助
- 2. 准备一个新分区
- 2.1. 简介
- 2.2. 创建一个新分区
- 2.3. 在新分区上创建文件系统
- 2.4. 挂载新分区
- 3. 软件包和补丁
- 3.1. 简介
- 3.2. 全部软件包
- 3.3. 需要的补丁
- 4. 最后的准备工作
- 4.1. 关于环境变量 $LFS
- 4.2. 创建 $LFS/tools 目录
- 4.3. 添加 LFS 用户
- 4.4. 设置工作环境
- 4.5. 关于 SBU
- 4.6. 关于软件包测试套件
- 5. 构建临时编译环境
- 5.1. 简介
- 5.2. 工具链技术说明
- 5.3. Binutils-2.16.1 - 第一遍
- 5.4. GCC-4.0.3 - 第一遍
- 5.5. Linux-Libc-Headers-2.6.12.0
- 5.6. Glibc-2.3.6
- 5.7. 调整工具链
- 5.8. Tcl-8.4.13
- 5.9. Expect-5.43.0
- 5.10. DejaGNU-1.4.4
- 5.11. GCC-4.0.3 - 第二遍
- 5.12. Binutils-2.16.1 - 第二遍
- 5.13. Ncurses-5.5
- 5.14. Bash-3.1
- 5.15. Bzip2-1.0.3
- 5.16. Coreutils-5.96
- 5.17. Diffutils-2.8.1
- 5.18. Findutils-4.2.27
- 5.19. Gawk-3.1.5
- 5.20. Gettext-0.14.5
- 5.21. Grep-2.5.1a
- 5.22. Gzip-1.3.5
- 5.23. M4-1.4.4
- 5.24. Make-3.80
- 5.25. Patch-2.5.4
- 5.26. Perl-5.8.8
- 5.27. Sed-4.1.5
- 5.28. Tar-1.15.1
- 5.29. Texinfo-4.8
- 5.30. Util-linux-2.12r
- 5.31. 清理系统
- 5.32. 改变所有者
- III. 构建 LFS 系统
- 第六章 安装系统基础软件
- 6.1. 简介
- 6.2. 挂载虚拟内核文件系统
- 6.3. 包管理
- 6.4. 进入 Chroot 环境
- 6.5. 创建系统目录结构
- 6.6. 创建必需的文件与符号连接
- 6.7. Linux-Libc-Headers-2.6.12.0
- 6.8. Man-pages-2.34
- 6.9. Glibc-2.3.6
- 6.10. 再次调整工具链
- 6.11. Binutils-2.16.1
- 6.12. GCC-4.0.3
- 6.13. Berkeley DB-4.4.20
- 6.14. Coreutils-5.96
- 6.15. Iana-Etc-2.10
- 6.16. M4-1.4.4
- 6.17. Bison-2.2
- 6.18. Ncurses-5.5
- 6.19. Procps-3.2.6
- 6.20. Sed-4.1.5
- 6.21. Libtool-1.5.22
- 6.22. Perl-5.8.8
- 6.23. Readline-5.1
- 6.24. Zlib-1.2.3
- 6.25. Autoconf-2.59
- 6.26. Automake-1.9.6
- 6.27. Bash-3.1
- 6.28. Bzip2-1.0.3
- 6.29. Diffutils-2.8.1
- 6.30. E2fsprogs-1.39
- 6.31. File-4.17
- 6.32. Findutils-4.2.27
- 6.33. Flex-2.5.33
- 6.34. GRUB-0.97
- 6.35. Gawk-3.1.5
- 6.36. Gettext-0.14.5
- 6.37. Grep-2.5.1a
- 6.38. Groff-1.18.1.1
- 6.39. Gzip-1.3.5
- 6.40. Inetutils-1.4.2
- 6.41. IPRoute2-2.6.16-060323
- 6.42. Kbd-1.12
- 6.43. Less-394
- 6.44. Make-3.80
- 6.45. Man-DB-2.4.3
- 6.46. Mktemp-1.5
- 6.47. Module-Init-Tools-3.2.2
- 6.48. Patch-2.5.4
- 6.49. Psmisc-22.2
- 6.50. Shadow-4.0.15
- 6.51. Sysklogd-1.4.1
- 6.52. Sysvinit-2.86
- 6.53. Tar-1.15.1
- 6.54. Texinfo-4.8
- 6.55. Udev-096
- 6.56. Util-linux-2.12r
- 6.57. Vim-7.0
- 6.58. 关于调试符号
- 6.59. 再次清理系统
- 6.60. 最终的清理
- 7. 配置系统启动脚本
- 7.1. 简介
- 7.2. LFS-Bootscripts-6.2
- 7.3. 启动脚本是如何工作的?
- 7.4. LFS 系统的设备和模块处理
- 7.5. 配置 setclock 脚本
- 7.6. 配置 Linux 控制台
- 7.7. 配置 sysklogd 脚本
- 7.8. 创建 /etc/inputrc 文件
- 7.9. Bash Shell 启动文件
- 7.10. 配置 localnet 脚本
- 7.11. 定制 /etc/hosts 文件
- 7.12. 为设备创建惯用符号连接
- 7.13. 配置网络脚本
- 8. 使 LFS 系统能够启动
- 8.1. 简介
- 8.2. 创建 /etc/fstab 文件
- 8.3. Linux-2.6.16.27
- 8.4. 使 LFS 系统能够启动
- 9. 结束
- 9.1. 结束
- 9.3. 重启系统
- 9.4. 现在做什么?
- IV. 附录
- A. 缩写和名词
- B. 致谢
- C. 依赖关系
- 长索引