LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - GCC-4.9.2

Posted Lucifer三思而后行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - GCC-4.9.2相关的知识,希望对你有一定的参考价值。

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

安装 GCC

首先进入到源码目录,解压软件包:

cd /sources
tar xf gcc-4.9.2.tar.bz2
cd gcc-4.9.2

GCC 的文档建议在源代码目录之外一个专用的编译目录中编译 GCC:

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

准备编译 GCC:

SED=sed                       \\
../gcc-4.9.2/configure        \\
     --prefix=/usr            \\
     --enable-languages=c,c++ \\
     --disable-multilib       \\
     --disable-bootstrap      \\
     --with-system-zlib

📢 注意: 对于其它的编程语言,现在还有一些前提条件没有准备好。可以查看 BLFS Book 了解如何编译 GCC 支持的所有语言的指令。

编译软件包:

make

GCC 测试套件中一个测试集的会耗尽堆栈空间,因此运行测试之前要增加栈大小:

ulimit -s 32768

测试编译结果,但不要因为出现错误就停下来:

make -k check


要查看测试套件结果的概要,运行:

../gcc-4.9.2/contrib/test_summary


如果只是查看概要,可以将输出通过管道送到 grep -A7 Summ


结果可以和 https://www.linuxfromscratch.org/lfs/build-logs/7.7-systemd/Core-i5-2430M/test-logs/082-gcc-4.9.2 相比较。

一些意料之外的错误总是难以避免。GCC 开发者通常意识到了这些问题,但还没有解决。除非测试结果和上面 URL 中的相差很大,不然就可以安全继续。

安装软件包:

make install

一些软件包希望 GCC 安装在 /lib 目录。为了支持那些软件包,可以建立一个符号链接:

ln -sv ../usr/bin/cpp /lib

译者注:如果还在 gcc-build 目录,这里应该是 ln -sv …/…/usr/bin/cpp /lib 。
很多软件包用命令 cc 调用 C 编译器。为了满足这些软件包,创建一个符号链接:

ln -sv gcc /usr/bin/cc

增加一个兼容符号链接启用编译程序时进行链接时间优化(Link Time Optimization,LTO):

install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/

现在我们最终的工具链已经准备就绪了,再一次确认编译和链接都能像预期那样正常工作很重要。我们通过做和前面章节做过的相同的完整性检查做到这点:

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'


这应该没有错误,最后一个命令的输出应该是(允许平台相关的动态链接器名字有差异):[Requesting program interpreter: /lib/ld-linux.so.2]

现在确认我们设置了正确的启动文件:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log


取决于你机器的架构,上面的结果可能有稍微不同,差异通常是 /usr/lib/gcc 后目录的名称。如果你的是 64 位系统,你也许能看到后面有个 lib64 的目录名字。这里重要的一点是 gcc 能在 /usr/lib 目录下找到所有的三个 crt*.o 文件。

验证编译器能搜索正确的头文件:

grep -B4 '^ /usr/include' dummy.log


同时,注意你的目标系统三段式后面的目录名称可能和上面的不同,这取决于你的架构。

下一步,验证新的链接器在使用正确的搜索路径:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\\n|g'


然后确认我们使用了正确的 libc:

grep "/lib.*/libc.so.6 " dummy.log


最后,确认 GCC 在使用正确的动态链接器:

grep found dummy.log


如果输出和上面的不一样或者根本就没有任何输出,表明发生了很严重的错误。检查并回溯步骤找出问题所在并纠正它。最可能的原因是配置文件调整时出现了问题。在进入下一步之前必须解决所有的问题。

当一切都正常工作后,清理测试文件:

rm -v dummy.c a.out dummy.log

最后,移动位置放错的文件:

mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

安装完成后清理工作:

cd ..
rm -rf gcc-build
rm -rf gcc-4.9.2

本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️

以上是关于LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - GCC-4.9.2的主要内容,如果未能解决你的问题,请参考以下文章

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - 进入 Chroot 环境

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Less-458

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Diffutils-3.3

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Kmod-19

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Libpipeline-1.4.0

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - Systemd-219