haulm 发表于 2010-9-11 10:35:44

讨论一下LFS GCC4.5 pass1 pass2 的编译过程

LFS 档案中关于GCC pass1 编译方案如下:
tar -jxf ../mpfr-3.0.0.tar.bz2
mv -v mpfr-3.0.0 mpfr
tar -jxf ../gmp-5.0.1.tar.bz2
mv -v gmp-5.0.1 gmp
tar -zxf ../mpc-0.8.2.tar.gz
mv -v mpc-0.8.2 mpc
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.5.1/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-shared --disable-multilib \
    --disable-decimal-float --disable-threads \
    --disable-libmudflap --disable-libssp \
    --disable-libgomp --enable-languages=c \
    --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
    --without-ppl --without-cloog

我照抄以上的内容进行编译根本就无法通过,LFS做为一个系统再造教程,其内容居然没有修正,导致初学者很难以入门。
首先,目前GCC的编译需要GMP MPFR MPC 的支持,而MPFR编译需要GMP,MPC编译需要GMP和MPFR,当你的系统上存在那三个组件的旧版本时,你的编译就被LFS误导了。。。因为LFS内容不够细致,你会花很多的时间折腾在GCC编译的出错上,并且一事无成。

修正LFS的GCC pass1 编译如下:
gmp/configure --prefix=/tools/init
make;make install
export LD_LIBRARY_PATH=/tools/init/lib
mpfr-3.0.0/configure --prefix=/tools/init --with-gmp=/tools/init
make;make install
mpc-0.8.2/configure --prefix=/tools/init--with-gmp=/tools/init--with-mpfr=/tools/init
make;make install
头文件位置偏差修正(gcc 4.6.1 无需此步)
mkdir /usr/include/libelf
cd /usr/include/libelf/
ln -s ../libelf.h
ln -s ../gelf.h
GCC 编译
export LD_LIBRARY_PATH=/tools/init/lib
../gcc-4.5.1/configure   --target=$LFS_TGT --prefix=/tools   --disable-nls --disable-shared --disable-multilib   --disable-decimal-float --disable-threads   --disable-libmudflap --disable-libssp   --disable-libgomp --enable-languages=c--without-ppl --without-cloog --with-gmp=/tools/init --with-mpfr=/tools/init --with-mpc=/tools/init

在 编译GCC之前准备环节中以及后面的几个组件编译都需要增加 LD_LIBRARY_PATH 的定义,否则经常出现编译中断。

export LD_LIBRARY_PATH=/tools/init/lib

但LD_LIBRARY_PATH 的定义最好不要加入到 .bashrc 中,以免发生错误。

切记,千万不要把GMP MPFR MPC 的 prefix 定义安装在/tools,而是 /tools/init 或其它目录,否则编译很难继续。

这里面有一个细节会影响到glibc的正常编译

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
    sed 's/libgcc/&_eh/'`

很难看懂,调整一下这种艰涩的写法:

cd /tools/lib/gcc/i686-lfs-linux-gnu/4.5.1
ln -s libgcc.alibgcc_eh.a

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

LFS GCC4.5 pass2 :

先声明原gmp mpfr mpc 的位置
export LD_LIBRARY_PATH=/tools/init/lib

gmp mpfr编译类似于以下mpc的编译,就不详解了,记得它们之间的依赖关系即可

mpc-0.8.2$    CC="$LFS_TGT-gcc -B/tools/lib/"   AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib ./configure --prefix=/tools --with-gmp=/tools --with-mpfr=/tools
make;make install

第二轮的GCC 编译参数,其它参考LFS吧
export LD_LIBRARY_PATH=/tools/init/lib
CC="$LFS_TGT-gcc -B/tools/lib/"   AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib   ../gcc-4.5.1/configure --prefix=/tools   --with-local-prefix=/tools --enable-clocale=gnu   --enable-shared --enable-threads=posix   --enable-__cxa_atexit --enable-languages=c,c++   --disable-libstdcxx-pch --disable-multilib   --disable-bootstrap   --with-gmp=/tools --with-mpfr=/tools --with-mpc=/tools   --without-ppl --without-cloog --disable-libgomp

完成第二次的GCC编译后就要去掉LD_LIBRARY_PATH 的定义了,还记得上面提到 LD_LIBRARY_PATH 的定义最好不要加入到 .bashrc 中,因为 GCC 第二次编译后就不能再用了。

echo $LD_LIBRARY_PATH
unset LD_LIBRARY_PATH

下一步编译 tcl8.5.8-src.tar.gz ,测试一下新的 gcc 是否可用了。
编译工具集,到 perl 时注意原 bintuils pass2 时
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
现在呢要将 ld-new 替换旧的 ld 指令
mv /tools/bin/ld /tools/bin/ld-old
mv /tools/bin/ld-new /tools/bin/ld
此后编译 perl 方能正常进行,之后工具链没完成前最好再改回来。。。

[ 本帖最后由 haulm 于 2011-10-20 01:58 编辑 ]

jiangtao9999 发表于 2010-9-11 12:34:50

把当前系统的库升级不就行了。

haulm 发表于 2010-9-11 13:29:52

原帖由 jiangtao9999 于 2010-9-11 12:34 发表 http://www.linuxfans.org/bbs/images/common/back.gif
把当前系统的库升级不就行了。
。。。我觉得LFS就是混蛋,前四个小时GCC能通过,GLIBC通不过,后四个小时GCC通不过了,又卡在libgcc编译。。。
然后 export LD_LIBRARY_PATH=/tools/init/lib
再make。。。通过了。。。而且编译glibc时也必需以上声明
:shock:
export LD_LIBRARY_PATH=/tools/init/lib 肯定要用到第二次编译 gmp mpfr mpc 完成后方能取消定义。

[ 本帖最后由 haulm 于 2010-9-11 23:38 编辑 ]

jiangtao9999 发表于 2010-9-11 18:44:08

lfs要选对起步系统,不然折磨死你。
我建议是用gentoo,最新的snapshot版本的stage3。之后除非你想先升级一下系统,可以用portage更新一下软件。不然直接进入lfs安装后直接无视portage。装软件、更新库全都直接源代码自己编译自己make install。portage除非需要卸载gentoo的包,不然不用。优化什么的一律不需要。尽快编译好系统后能到chroot状态就尽早切换过去变成本地编译状态重新做环境。

haulm 发表于 2010-9-12 05:58:58

原帖由 jiangtao9999 于 2010-9-11 18:44 发表 http://www.linuxfans.org/bbs/images/common/back.gif
lfs要选对起步系统,不然折磨死你。
我建议是用gentoo,最新的snapshot版本的stage3。之后除非你想先升级一下系统,可以用portage更新一下软件。不然直接进入lfs安装后直接无视portage。装软件、更新库全都直接源代码自己 ...
我想 LFS 应该和系统是无关的,之所以编译困难,是因为 LFS 不够详细,并且有些细节没有修正,比如 gmp mpfr mpc 这三个组件解压放在 gcc 目录进行编译,我在 mgc2.5 下根本无法编译,所以就出现了这个讨论帖子。再比如-disable-libgomp 在 LFS 中没有提到,但 mgc 2..5 有 libgomp 组件,所以。。。

gcc 第二次编译已经通过:

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/mnt/lfs/tools/bin/../libexec/gcc/i686-pc-linux-gnu/4.5.1/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.5.1/configure --prefix=/tools --with-local-prefix=/tools --enable-clocale=gnu --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-languages=c,c++ --disable-libstdcxx-pch --disable-multilib --disable-bootstrap --with-gmp=/tools --with-mpfr=/tools --with-mpc=/tools --without-ppl --without-cloog --disable-libgomp
Thread model: posix
gcc version 4.5.1 (GCC)

[ 本帖最后由 haulm 于 2010-9-12 06:01 编辑 ]

haulm 发表于 2010-9-12 07:39:10

工具链编译完成 99%,就一个 perl 无法编译,暂时丢弃 perl 的编译。。。

jiangtao9999 发表于 2010-9-12 09:53:26

perl本地编译就行了……
lfs不过是一本参考书,为什么要一字不差的去按照lfs去做?
lfs本身是系统无关的,但本地的交叉编译链是有关的。

我拿windows去编译,难道可以用visual stdio直接编译gcc、binutils么?

haulm 发表于 2010-9-13 00:33:59

原帖由 jiangtao9999 于 2010-9-12 09:53 发表 http://www.linuxfans.org/bbs/images/common/back.gif
perl本地编译就行了……
lfs不过是一本参考书,为什么要一字不差的去按照lfs去做?
lfs本身是系统无关的,但本地的交叉编译链是有关的。

我拿windows去编译,难道可以用visual stdio直接编译gcc、binutils么? ...
lfs 的确是本参考书,但是 lfs 的编译参数应该和所使用的组件版本相符才是合理的,之所以要讨论gcc4.5 pass1 pass2 就是因为从beta版到rc1版的 lfs 6.7 在编译 gcc 4.5 所用的参数是错误的,因为很早以前编译 gcc 只把它所依赖的 gmp mpfr mpc 解压到 gcc 源码目录并参数指定位置的这种编译方法已经行不通了。
初学 lfs 肯定要一字不差的去按照 lfs 先去做,遇到问题只好自行解决,并不是因为 lfs 是参考书就无视里面内容不符实际,否则 lfs 就不需要更新了。
lfs 和 系统无关,而且本地的交叉编译如果排除掉本地系统的干扰,gcc 两次 pass是可以进行的,gcc 一旦两次编译成功,那么接下去的内容和原系统根本没有任何关系了。
win 上 visual stdio 去编译 visual stdio 和系统本身也不会有太大关系,不必要神化不同母系统两次同一版本gcc编译后出来的二进制代码有多少差异,只要版本一样,不同的系统编译出来的结果不会有什么差别,何况现在的linux 类库的兼容性不错,很多商业软件并不需要重新编译直接工作于各种Linux系统。没人要用 visual stdio 去编译 linux,不要偷换概念。

jiangtao9999 发表于 2010-9-13 10:42:14

其实 lfs 我觉得最好的办法就是直接 1 次编译 gcc 以及 binutils 等等交叉工具,之后马上输出目标环境 gcc binutils ,glibc ,make, bash 等软件。
尽快的能达到 chroot 运行 bash 到新环境的状态,而且新环境最低限的可以编译程序的状态,之后慢慢本地编译吧。交叉编译环境再好也不如本地环境好啊。

这个状态貌似目标环境运行的 gcc 只保留 c 编译都能完成,当然最好还是 c、c++ 两种编译器以防万一。

jxxfpw 发表于 2010-10-31 00:43:29

LZ我真是爱死你了

目前正在安装LFS系统,但是编译到GCC这里就不行了,就是gmp mpc mpfr 这三个东东的问题,我搞来搞去,也没搞出个名堂来,还好有大侠你的文章。如果LFS每个版本的安装指南能写得和gentoo那么详细就有福了。可能是LFS的大牛们觉得一些小细节安装着能搞定,可是俺们这些刚进来编译LFS的,可就头在了N倍啊。gentoo的文档真是太好了。

haulm 发表于 2010-10-31 09:43:50

楼上的,有空把自己的经验心得用在MGC的话,我也会爱死你的 :wink:

jxxfpw 发表于 2010-11-6 23:28:24

原帖由 haulm 于 2010-10-31 09:43 发表 http://www.linuxfans.org/bbs/images/common/back.gif
楼上的,有空把自己的经验心得用在MGC的话,我也会爱死你的 :wink:
哎,不容易,这几天千辛万苦的编译GCC,终于今天通过了编译,按照版主的方法做,但是在我机器上,不知怎么,mpc的头文件与库文件没有自动复制到/init/这个文件里来,害的我自己找啊找的,从mpc的编译文件夹及源文件夹里把头文件与库文件拷过来,第一弄这个,又不熟的,走了不少弯路啊!!!!

haulm 发表于 2011-10-19 08:58:40

自己顶一下,LFS 上面工具链的编译仍然是不清不楚。

sejishikong 发表于 2011-10-19 10:44:40

工具链编译想要比较清楚的话,不如基于clfs。

huizige 发表于 2011-10-19 12:13:28

我用ALFS编译,6.8已经通过,实在是手工编译不通就用JHALFS的脚本对比看看,如果学习LFS其实也应该用脚本,出错也有个找错的主。
页: [1] 2
查看完整版本: 讨论一下LFS GCC4.5 pass1 pass2 的编译过程