前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LFS 系列】从零开始 DIY Linux 系统:(五)构建临时系统 - GCC-4.9.2 - 第2遍

【LFS 系列】从零开始 DIY Linux 系统:(五)构建临时系统 - GCC-4.9.2 - 第2遍

作者头像
Lucifer三思而后行
发布2021-09-26 11:11:03
4310
发布2021-09-26 11:11:03
举报
文章被收录于专栏:公众号:Lucifer三思而后行

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

第一次编译 GCC 的时候安装了一些内部系统头文件。

其中的一个 limits.h 会反过来包括对应的系统头文件 limits.h, 在我们的例子中,是 /tools/include/limits.h。

但是,第一次编译 gcc 的时候 /tools/include/limits.h 并不存在,因此 GCC 安装的内部头文件只是部分的自包含文件, 并不包括系统头文件的扩展功能。这足以编译临时 libc,但是这次编译 GCC 要求完整的内部头文件。

首先,切换到 lfs 用户下:

代码语言:javascript
复制
su - lfs

确保环境变量已生效,并且解压软件包

代码语言:javascript
复制
echo $LFS
cd $LFS/sources
tar xf gcc-4.9.2.tar.bz2
cd gcc-4.9.2

使用和正常情况下 GCC 编译系统使用的相同的命令创建一个完整版本的内部头文件:

代码语言:javascript
复制
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

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

代码语言:javascript
复制
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 包并把它们重名为到所需的文件夹名称:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
mkdir -v ../gcc-build
cd ../gcc-build

准备编译 GCC:

代码语言:javascript
复制
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

编译软件包:

代码语言:javascript
复制
make

安装软件包:

代码语言:javascript
复制
make install

作为画龙点睛,这里创建一个符号链接:

代码语言:javascript
复制
ln -sv gcc /tools/bin/cc

检查是否安装成功:

代码语言:javascript
复制
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

???? 注意:如果上述执行返回结果是:[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2],则代表正常。

安装完成后清理工作:

代码语言:javascript
复制
rm -v dummy.c a.out
cd ..
rm -rf gcc-build
rm -rf gcc-4.9.2
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档