本文最初发表在Linuxsir.org的BBS上,因为有了自己的BLOG所以将其原模原样的转放到BLOG上
用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。
补丁文件下载:
制作工具链:
问题一:
在制作工具链这个章节中需要注意的是编译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.com QQ:5132989)
转载请保持原文的完整性以及作者和出处,谢谢。
冲天飞豹(youbest)
2005年7月19日
阅读(5410) | 评论(12) | 转发(2) |