开源中文网

您的位置: 首页 > LFS > 正文

用GCC4.0.1来编译LFS

来源: 网络整理  作者: youbest

一点废话:
  大家好,我初次来到这里的LFS版还是2004的10月份,我发现我终于找到了一个让我兴奋的Linux版本,其实应该说是制作方法,在这大半年的时间里我反复琢磨这LFS,也来来回回不知道安装了多少遍,不过从这些安装中确实学会了很多知识,接触LFS之前就已经接触Linux有将近两年了,但也没学到什么,只是会安装RedHat和一些服务器上用的软件,但这半年的对LFS的学习所得到的知识是以前学到的Linux知识的总和还要大几倍。所以在这里非常感谢Linuxsir上的高手,因为我经常来这里翻阅文章来学习,从中得到了许多知识和启发。
  不过说来惭愧,除了刚进来的时候写了一个回复要求加入外,一篇帖子和回复都没有写,主要是因为能上来的时间不算多,我希望能多看些东西,所以就很少发言,而且对Linux技术还十分缺乏,也希望充实了一些知识后再写写帖子。
  最近有了一些时间,所以重头开始编译LFS,并使用了最新的软件版本来编译,目前将LFS全部的软件都使用GCC4.0.1编译成功,我将我的一点经验和理解写出来,一方面回报Linuxsir对我的帮助,另一方面也希望能帮助想使用GCC4.0.1来编译LFS的人。

前言:
  GCC的4.0版本已经出现了一段时间,据说GCC4采用了一些新的算法和新的结构来编译软件,在未来的日子里GCC4的威力会逐渐显现出来,于是出现了许多想采用GCC4来编译系统的人,本人就是一个,但在编译过程中出现了不少问题,但也逐一解决了,最终成功的编译了LFS中的所有标准软件包。
  在第一次成功的编译GCC4的LFS时候,LFS的官方还没有出现GCC4的编译版本,于是也不知道自己的编译方法是否有问题,前几天出现了 GCC4.0.1的版本,于是重新拿GCC4.0.1又编译了一遍也顺利通过,这时候发现LFS的官方网站上已经出现了GCC4的测试版本,于是综合了我自己的方法和LFS上的方法相结合。不过就我目前写这篇文章的时候的LFS-BOOK-GCC4-20050717并不能顺利编译通过,所以我决定将我的编译过程写出来供大家参考,如果发现什么问题大家一起讨论。
  我将按照您已经成功的编译过LFS以前版本为基础来讲解不同之处,所以如果有什么疑问请先阅读LFS。

补丁文件下载:
  http://www.linuxfromscratch.org/patc...-specs-1.patch
  http://www.linuxfromscratch.org/patc...ix_elf-1.patch
  http://www.linuxfromscratch.org/patc...nvdata-1.patch
  http://www.linuxfromscratch.org/patc...string-1.patch
  http://www.linuxfromscratch.org/patc...ymbols-1.patch
  http://www.zdbr.net.cn/download/inet...ix-shy-1.patch


制作工具链:
  问题一:
    在制作工具链这个章节中需要注意的是编译GLibc2.3.5的时候,如果不打补丁是无法通过编译的。
  解决方法:
    这里的补丁在网上还有其它类似的,不过既然是LFS,所以使用了LFS上的补丁:
     patch -Np1 -i ../glibc-2.3.5-fix_test-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_symbols-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_string-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_elf-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_iconvdata-1.patch
    这样就可以顺利的通过GLibc2.3.5的编译
  原因:
    这是因为GCC4.0.1的语法检查和GCC3.3.x的有所区别,所以通过补丁调整GLibc的语法,从而使编译顺利通过。

  问题二:
    接下来的调整工具链的时候一定会发现按照原来的方法:
      gcc --print-file specs
    什么文件名也得不到?天,这怎么调整。
  解决方法:
    我原来的方法是:
      gcc -dumpspecs > /tools/lib/gcc/i686-pc-linux-gnu/4.0.1/specs
      SPECFILE=`gcc --print-file specs`
      sed 's@/lib/ld-linux.so.2@/tools/lib/ld-linux.so.2@g' $SPECFILE > tempspecfile 
      mv -f tempspecfile $SPECFILE &&
      unset SPECFILE
    需要注意的是/lib/ld-linux.so.2和/tools/lib/ld-linux.so.2前面的空格要去掉。

    LFS上的方法是:
      SPECFILE=`gcc -print-search-dirs | head -n 1 | awk '{ print $2 "specs" }'` &&
      gcc -dumpspecs > $SPECFILE &&
      sed -i -e 's@^/lib/ld-linux.so.2@/tools&@g' $SPECFILE &&
      unset SPECFILE
  结果都是一样的,不过人家还是棋高一照,写的比我自己写的通用多了。
  原因:
    我觉得是因为GCC3.4.4之前的默认使用文件形式的specs文件,而4.0以后使用的是默认的specs设置,不需要文件了,不过如果有文件则使用文件的定义。因此休整工具链的时候必须将设置导出成文件,然后再修改文件即可。gcc -dumpspecs就是导出specs设置的命令。

  问题三(隐性问题,不知道是否属于问题):
    在GCC3.4.x编译第二遍的时候需要两个补丁文件在GCC4中只需要一个了,就是
     gcc-4.0.1-specs-1.patch
    同时修改GCC编译过程中使用的头文件的目录:
      我自己编译的时候是手工修改的。
      你可以使用LFS的命令格式:
       sed -i 's@\(^NATIVE_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g' gcc/Makefile.in
    这一步的作用是使用正确的头文件目录。如果这一步不做,也是能编译通过的,只不过使用的是/usr/include下的头文件,如果主系统和目标系统并没太大差别是没关系的,不过如果差别比较大可能会出现想不到的结果。

  问题四(隐性问题)
    建议在编译完成了M4的编译后再加入两个软件包的编译:bison2.0和flex2.5.31
    bison-2.0:
      tar xvfz bison-2.0.tar.gz &&
      cd bison-2.0 &&
      ./configure --prefix=/tools && make && make install &&
      cd .. &&
      rm -rf bison-2.0 &&
    flex-2.5.31:
      tar xvfj flex-2.5.31.tar.bz2 &&
      cd flex-2.5.31 &&
      patch -Np1 -i ../flex-2.5.31-debian_fixes-4.patch &&
      touch doc/flex.1 &&
      ./configure --prefix=/tools && make && make install &&
      cd .. &&
      rm -rf flex-2.5.31 &&
  原因:
    在LFS编译第6章的flex的时候会出现编译错误,提示无法找到flex,因此在编译工具链的时候加入此编译软件包可顺利通过第6章的flex的编译。

  建议:
    在去掉调试信息的这个步骤中建议使用:
     find /tools/lib -type f -exec /tools/bin/strip --strip-debug '{}' ';'
     find /tools/{bin,sbin,libexec} -type f -exec /tools/bin/strip --strip-all '{}' ';'
    可以更加彻底的去掉程序中的调试信息。

至此,工具链的编译已经完成。


编译一个可用的基本系统:
  问题一:
    同样是在编译GLibc2.3.5的时候的问题,如果按照LFS中的做法不打补丁这里是无法编译通过的,打的补丁和制作工具链的时候的方法相同
     patch -Np1 -i ../glibc-2.3.5-fix_test-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_symbols-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_string-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_elf-1.patch &&
     patch -Np1 -i ../glibc-2.3.5-gcc4_fix_iconvdata-1.patch
    即可通过编译。

  问题二:
    同样还是调整工具链的问题,使用
     SPECFILE=`gcc -print-search-dirs | head -n 1 | awk '{ print $2 "specs" }'` &&
     gcc -dumpspecs > $SPECFILE &&
     sed -i -e 's@^/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' $SPECFILE &&
     unset SPECFILE
    也可顺利通过
  问题三:
    后面的编译将会一切顺利,直到碰到inetutils-1.4.2这个包,这个也是我最头疼的一个包。这个包必须要打一个在网上下的GCC4的补丁才能够编译通过,前段时间就已经完成了GCC4的编译过程,正当我庆幸的时候,我突然发现这个包编译的ftp在运行的时候有段失败的错误。于是放弃了发表编译过程的文章,因为至少我发现了这个问题,在GCC4.0.1出来后我又立即完成了一遍发现还是有这个问题。我到处在网上寻找答案,但是没有结果,于是我开始放弃,并等待LFS官方的发布,但是这次让我失望,官方的文章里面并没有提到这个问题,这次我横下一条心,开始读程序,最后自己写了一个补丁,目前使用正常。
  解决方法:
    按照GCC3.4.x的关于inetutils包的编译方法加入一个补丁:
     patch -Np1 -i ../inetutils-1.4.2-gcc4-fix-shy-1.patch

  问题四(建议):
    安装file-4.14的时候,同时下载提供file-4.14网站上的file-4.14补丁文件
    patch -Np0 -i ../file-4.14.patch1


  后面的编译可以正常直到结束,到此为止,GCC4.0.1编译基本工具包的过程已经完成。但用GCC4.0.1来编译BLFS的过程中还会遇到许多问题。在此先解决一个问题:关于xfsprogs-2.6.25包的编译补丁,该补丁可以在Gentoo中下载到:
cd xfsprogs-2.6.25
patch -Np2 -i ../xfsprogs-2.6.25-gcc4.patch


附录:
  我用GCC4.0.1成功编译的软件包集合
   autoconf-2.59
   bash-3.0
   bc-1.06
   binutils-2.16.1
   bison-2.0
   bzip2-1.0.3
   coreutils-5.2.1
   diffutils-2.8.1
   e2fsprogs-1.38
   file-4.14
   findutils-4.2.23
   flex-2.5.31
   gawk-3.1.4
   gettext-0.14.5
   glibc-2.3.5
   grep-2.5.1a
   groff-1.19.1
   grub-0.97
   gzip-1.3.5
   hotplug-2004_09_23
   iana-etc-1.10
   inetutils-1.4.2
   iproute2-2.6.11-050330
   kbd-1.12
   less-382
   lfs-bootscripts-3.2.1
   libtool-1.5.18
   m4-1.4.3
   make-3.80
   man-1.6
   man-pages-2.05
   mktemp-1.5
   module-init-tools-3.1
   ncurses-5.4
   net-tools-1.60
   openssl-0.9.7g
   patch-2.5.4
   perl-5.8.7
   procps-3.2.5
   psmisc-21.6
   readline-5.0
   reiserfsprogs-3.6.19
   sed-4.1.4
   shadow-4.0.10
   sysklogd-1.4.1
   sysvinit-2.86
   tar-1.15.1
   texinfo-4.8
   unzip552
   util-linux-2.12q
   vim-6.3
   wget-1.9.1
   xfsprogs-2.6.25
   zip231
   zlib-1.2.2
   automake-1.9.6
   udev-063
   linux-2.6.12.3
   linux-libc-headers-2.6.12.0
   gcc-4.0.1

主系统环境:
   自己制作的基于LFS的LiveCD,所以不知道是否在其它系统下工作良好。
   在VMware下编译。

  (本人水平有限,如果你已经成功的编译,或者你发现我写的有什么不对的地方请及时纠正我。email:youbest@sina.comQQ:5132989
  转载请保持原文的完整性以及作者和出处,谢谢。

Tags: GCC401 编译LFS
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明