LFS 学习日记(第五章构建临时系统之5.10. GCC-4.4.3第二遍)

2010年06月26日 星期六
http://www.linuxfromscratch.org/lfs/view/6.6/chapter05/gcc-pass2.html
5.10. GCC-4.4.3 - Pass 2

Versions of GCC later than 4.3 will treat this build as if it were a relocated compiler and disallow searching for startfiles in the location specified by --prefix.
question: 什么是“relocated compiler”?什么是"startfiles"?

abs-guide/special-chars.html
cp -v gcc/Makefile.in{,.orig} 相当于 cp -v gcc/Makefile.in gcc/Makefile.in.orig

question: {} 在 bash 中的使用

2010年06月27日 星期日

For x86 machines, a bootstrap build of GCC uses the -fomit-frame-pointer  compiler flag.
question: 什么是bootstrap build? ( 参考资料 http://veryzhang.cn/?p=105 )

question: T_CFLAGS = -fomit-frame-pointer 是什么意思?

sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file # 删除包含MULTILIB_OSDIRNAMES的所有行

--disable-bootstrap
However, the LFS build method should provide a solid compiler without the need to bootstrap each time.
question: 编译一个可靠的编译器与编译bootstrap的编译难道有冲突吗?不使用 --disable-bootstrap 这个参数有什么后果吗? 答案: http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter05/gcc-pass2.html

Install the symlink as per above. as per: 按照,根据 http://dict.cn/as+per

2010年06月28日 星期一

patch -Np1 -i ../gcc-4.4.3-startfiles_fix-1.patch # -N 忽略反转或已经应用过的补丁;-p1 删除第1个/及以前的部分作为补丁文件的路径名 -i 补丁文件
todo: diff 与 patch 的应用 (参考资料: 用Diff和Patch工具维护源码 http://www.ibm.com/developerworks/cn/linux/l-diffp/index.html )

question: sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in 里面 Makefile.in 里的“$(SHELL) -c true ../../gcc/$${fix_dir} ” 是什么意思?

question: T_CFLAGS = -fomit-frame-pointer 说是针对编译一个bootstrap的gcc,而后面 ./configure 又是--disable-bootstrap,不编译成 bootstrap 的,这不矛盾的吗?
参考资料:(注:这篇参考资料是LFS6.2的中文翻译相关章节,LFS6.6相对于它已经发生了不少重大的变化,因此LFS6.2中关于bootstrap 的描述只能作为一个理解的参考)http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter05/gcc-pass2.html 在LFS6.2中(两次编译均没有指定 --build --host --target 等参数),说的大概就是为了跟前面的 bootstrap 方式保持一致,这次虽然是非 bootstrap 方式编译,也要强制使用这个 -fomit-frame-pointer 编译参数;而为什么两次编译gcc都是本地编译(native,据: http://www.cublog.cn/u1/46715/showart_446825.html 当 --build 不等于 --host 才是交叉编译,但是不知道 --build 不等于 --target 是不是交叉编译?),而第二次用非 bootstrap 编译的原因是因为“现在没必要用 bootstrap 作为 make 的目标,因为这里 GCC 是用相同版本的 GCC 来编译的,其实连源码都一模一样,就是在第一遍的时候安装的那个。”。(理解可能有误,需要进一步学习)
2010.6.29注:经试验,在LFS6.6中,gcc第一次编译用了 -target=$LFS_TGT 参数,默认就成了非 bootstrap 编译了,同时默认不使用 -fomit-frame-pointer 编译参数;当去掉此参数后,默认就成了 bootstrap 编译了,同时默认使用 ./gcc/Makefile 中的 -fomit-frame-pointer 编译参数(3次编译gcc,好像stage1 时没有这个参数,stage2 才出现了这个参数)。For native builds of GCC, the default is to do a "bootstrap" build. 因为在LFS6.6中第一遍gcc编译中加了 --target 参数后就成了 non-bootstrap 编译了,那么加了 --target 参数就不是 native 编译了。

lfs:/mnt/lfs/sources/gcc-build$ time { CC="$LFS_TGT-gcc -B/tools/lib/"     AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib     ../gcc-4.4.3/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 && make && make install; }
real    10m33.029s
user    11m6.130s
sys    7m50.297s

在$LFS/tools/bin 目录下GCC pass 2创建的文件:
lfs:/mnt/lfs/sources/gcc-build$ find $LFS/tools/bin -cmin -30
/mnt/lfs/tools/bin
/mnt/lfs/tools/bin/c++
/mnt/lfs/tools/bin/i686-pc-linux-gnu-gcc-4.4.3
/mnt/lfs/tools/bin/cpp
/mnt/lfs/tools/bin/i686-pc-linux-gnu-g++
/mnt/lfs/tools/bin/i686-pc-linux-gnu-c++
/mnt/lfs/tools/bin/g++
/mnt/lfs/tools/bin/gcov
/mnt/lfs/tools/bin/cc
/mnt/lfs/tools/bin/gccbug
/mnt/lfs/tools/bin/i686-pc-linux-gnu-gcc
/mnt/lfs/tools/bin/gcc

可见是本地编译而非交叉编译。

用另一个帐户测试 bootstrap 编译和 非 bootstrap 编译的区别,同样设置 MAKEFLAGS='-j 2'的环境变量:
1)bootstrap 编译:
mdx@u1004b2-desktop:/mnt/lfs/sources/gcc-build1$ time { ../gcc-4.4.3/configure --prefix=/home/mdx/test/gcc1 --enable-clocale=gnu     --enable-shared --enable-threads=posix     --enable-__cxa_atexit --enable-languages=c,c++     --disable-libstdcxx-pch --disable-multilib  && make && make install; }
real    34m30.032s
user    43m1.217s
sys    20m3.227s

其中的 gcc/Makefile T_CFLAGS 和 CFLAGS 内容:
# Default values for variables overridden in Makefile fragments.
# CFLAGS is for the user to override to, e.g., do a cross build with -O2.
# TCFLAGS is used for compilations with the GCC just built.
# T_CFLAGS is used for all compilations and is overridden by t-* files.
T_CFLAGS =
TCFLAGS =
CFLAGS = -g -O2 -fomit-frame-pointer
LDFLAGS =

2)、非 bootstrap 编译,在源码中的 gcc/Makefile.in 中添加了 T_CFLAGS = -fomit-frame-pointer 编译参数:
mdx@u1004b2-desktop:/mnt/lfs/sources/gcc-build2$ time { ../gcc-4.4.3/configure --prefix=/home/mdx/test/gcc2 --enable-clocale=gnu     --enable-shared --enable-threads=posix     --enable-__cxa_atexit --enable-languages=c,c++     --disable-libstdcxx-pch --disable-multilib --disable-bootstrap  && make && make install; }
real    10m14.630s
user    10m23.475s
sys    8m0.422s
其中的 gcc/Makefile T_CFLAGS 和 CFLAGS 内容:
T_CFLAGS = -fomit-frame-pointer
TCFLAGS =
CFLAGS = -g
LDFLAGS =

lfs:/mnt/lfs/sources/binutils-build$ time { ../binutils-2.20/configure     --target=$LFS_TGT --prefix=/tools     --disable-nls --disable-werror && make && make install; }
real    1m27.311s
user    1m17.145s
sys    1m23.325s

lfs:/mnt/lfs/sources/gcc-build$ time { ../gcc-4.4.3/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 && make && make install; } > ~/gcc1.log
real    6m59.936s
user    7m36.865s
sys    5m3.035s

2010年06月29日 星期二

lfs:/mnt/lfs/sources/gcc-build$ time { ../gcc-4.4.3/configure  --prefix=/tools     --disable-nls --disable-shared --disable-multilib     --disable-decimal-float --disable-threads     --disable-libmudflap --disable-libssp     --disable-libgomp --enable-languages=c && make && make install; } > ~/gcc1.noany.log 2>&1
real    31m52.479s
user    37m40.145s
sys    20m2.271s

lfs:/mnt/lfs/sources/gcc-build$ time { ../gcc-4.4.3/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 --enable-bootstrap && make && make install; } > ~/gcc1.target.enbootstrap.log 2>&1
此次在stage2 中出错退出,报告为:
checking for library containing strerror... configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.
make[2]: *** [configure-stage2-libiberty] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/gcc-build'
make[1]: *** [stage2-bubble] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/gcc-build'
make: *** [all] Error 2
退出之前的时间为:
real    7m45.302s
user    7m31.692s
sys    5m27.716s

可见,加了 --target 参数后强制启用 bootstrap 编译会出错, question: 为什么呢?