[LFS] My Own Linux 第二天
总结第一天的工作,其实还是有些问题的,首先binutils是用原有的gcc-4.1.2编译的,而我们的目标是使用gcc-4.3.3的版本,因此后面还需要重新用gcc-4.3.3编译binutils,因此我想对此作出一些改进,完全删除并再次建立干净的tools目录,重新按第一天的方式设置工作环境,这时sources目录有我们第一天得到的source包,按如下顺序解压。
此外由于binutils的bug,在linkglibc的时候会出现collect2:ldreturned1的错误,重新下载binutils的新版本和patch.
cd $LFS/sources wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2 #解压gcc tar xvf gcc-4.3.3.tar.bz2 # 将binutils解压GCC的源码目录中 tar xvf binutils-2.19.tar.bz2 --strip-components=1 -C gcc-4.3.3 #解压gmp tar xvf gmp-4.2.4.tar.bz2 #将所有源码移到gcc-4.3.3的gmp目录下 mv gm-4.2.4 gcc-4.3.3/gmp #解压mpfr tar xvf mpfr-2.3.2.tar.bz2 #将所有源码移到gcc-4.3.3的mpfr目录下 mv mpfr-2.3.2 gcc-4.3.3/mpfr mkdir gcc-build cd gcc-build #如此编译,可以和gcc一起做bootstrap, 我们只编译C语言来缩短时间 CFLAGS="-O2 -march=i686" CC="gcc -B/usr/bin" ../gcc-4.3.3/configure --prefix=/tools --disable-nls --disable-multilib --disable-werror --enable-languages=c -build=i686-pc-linux-pc make bootstrap make install cp -v ld/ld-new /tools/bin rm -rf gcc-build rm -rf gcc-4.3.3 编译完毕后可以使用"make check"运行测试套件。这个测试套件依赖于DejaGnu软件包,而DejaGnu又依赖于expect,expect依赖于tcl。 如果只想编译 ld 可以使用"make all-ld",如果只想编译 as 可以使用"make all-gas"。类似的还有 clean-ld clean-as distclean-ld distclean-as check-ld check-as 等。 这种方法比第一天的方法好得多,因为第一天的方法在后面的glibc编译时候会出现can not computer sizeof的错误,去掉 --with-binutils=/tools/bin才可通过,怀疑是ld未经过make bootstrap的缘故。 如果一切顺利的话,我们现在得到了最新版的GCC 4.3.3, 接下来,我们需要将linux的头文件倒入include目录中,以便后面的编译工作,这个应该很容易。 〔code] wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.7.tar.bz2 tar xvf /lfs-sources/linux-2.6.28.7.tar.bz2 cd linux-2.6.28.7 make mrproper make headers_check make INSTALL_HDR_PATH=dest headers_install cp -rv dest/include/* /tools/include cd .. rm -rf linux-2.6.28.7
然后开始glibc的编译工作.
你必须设定march这个参数才行,要不然会出现“undefinedreferenceto`__sync_bool_compare_and_swap_4′.”这个错误
Core2Duo,
GCC4.2,CFLAGS添加-march=nocona-mtune=generic。
如果是GCC4.1,CoreSolo/Duo使用-march=prescott;
Core2Duo/Solo则使用-march=nocona。
i686等类似设置,例如CFLAGS=”-O2-march=i686″
-----------------
看到在buildncsd目录时也有错误
如果还有undefinedreferenceto`__stack_chk_guard’这个错误的话,你需要手工编辑Makefile,找到这一行:
LDLIBS-nscd=$(selinux-LIBS)
添加-lssp即
LDLIBS-nscd=$(selinux-LIBS)-lssp
wget http://sources.redhat.com/pub/glibc/snapshots/glibc-2.9-20090308.tar.bz2 tar xvf glibc-2.9-20090308.tar.bz2 cd glibc-2.9-20090308 mkdir -v ../glibc-build cd ../glibc-build CFLAGS="-O2 -march=i686" CC="gcc -B/tools/bin" ../glibc-2.9-20090308/configure --prefix=/tools \ --disable-profile --enable-add-ons=nptl \ --enable-kernel=2.6.28 --with-binutils=/tools/bin \ --without-gd --with-headers=/tools/include \ --without-selinux --build=i686-pc-linux-gnu --disable-multilib make mkdir -v /tools/etc touch /tools/etc/ld.so.conf make install cd .. rm -rf glibc-build rm -rf glibc-glibc-2.9-20090308
有一些麻烦问题需要处理,要不然,这个新的gcc环境还是对你
现在运行的系统有关系,因为gcc的fixincludes脚本在创建gcc的过程中,由于某些原因把你系
统里的头文件复制给这个新的gcc环境中去了。这就是好心办坏事,不过不用担心,是有办法挽
救的。执行下面的命令会将fixincludes产生的影响处理掉,当然,如果fixincludes没有帮倒
忙,下面的命令也不会作坏事,破坏这个新生的gcc环境: