用GCC4.0.1来编译LFS
一点废话:大家好,我初次来到这里的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 &&[page_break]
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的补丁才能够编译通过,前段时间