[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环境:

相关推荐