制作工具链前的准备工作
使用 LiveCD 开机,直接按回车键启动,所有设置均采用默认。
如果希望使用ssh进行远程安装,请执行如下步骤:
passwd ...... net-setup ...... /etc/rc.d/init.d/sshd start
磁盘分区与格式化(使用cfdisk的具体操作就不详细说明了,这里只给出结果):
/dev/sda1 ext2 /boot 10MB /dev/sda2 xfs / 50MB /dev/sda3 xfs none 50MB [将来升级的备用根目录] /dev/sda5 xfs /usr 300MB /dev/sda6 xfs /root 300MB [借用为 DESTDIR 父目录,也为将来升级的备用usr目录] /dev/sda7 xfs /var 200MB /dev/sda8 xfs /www 200MB [ WEB 目录,借用存放临时工具链] /dev/sda9 xfs /data 剩余 [数据库目录,借用存放源代码和编译目录] mke2fs -q -T news /dev/sda1 && mkfs.xfs -f -q /dev/sda2 && mkfs.xfs -f -q /dev/sda3 && mkfs.xfs -f -q /dev/sda5 && mkfs.xfs -f -q /dev/sda6 && mkfs.xfs -f -q /dev/sda7 && mkfs.xfs -f -q /dev/sda8 && mkfs.xfs -f -q /dev/sda9 &&
制作工具链之前的准备工作(省略了软件包和补丁的下载命令)。
[提示]如果在工具链的制作过程中中途关机,那么只需在重新开机后重新执行下面的命令即可恢复工作状态。不过,关机前一定要运行"sync"命令并umount所有挂载点,否则可能出现意外。 [说明]为了binutils-pass2测试成功,这里使用了一个rm废除LiveCD的g++和cpp,否则ld测试可能会失败。不过,没有C++编译器将会导致Glibc的 bug-atexit3-lib.os tst-cancel24.o c++-types-check 测试失败,并且无法运行dejagnu的测试程序。
rm -fr /usr/bin/*{c,g}++ /usr/include/c++ /usr/lib/lib{stdc++,supc++}.* /usr/lib/gcc/*/*/cc1plus /lib/cpp /usr/bin/cpp && export LFS=/mnt/lfs && mkdir -p $LFS && mount -t xfs /dev/sda2 $LFS && mkdir -p $LFS/boot && mount -t ext2 /dev/sda1 $LFS/boot && mkdir -p $LFS/usr && mount -t xfs /dev/sda5 $LFS/usr && mkdir -p $LFS/root && mount -t xfs /dev/sda6 $LFS/root && mkdir -p $LFS/var && mount -t xfs /dev/sda7 $LFS/var && mkdir -p $LFS/www && mount -t xfs /dev/sda8 $LFS/www && mkdir -p $LFS/data && mount -t xfs /dev/sda9 $LFS/data && # 这里省略了下载软件包和补丁的命令 ln -sf $LFS/www / && echo 'exec env -i HOME=$HOME TERM=$TERM PS1="\\u:\\w\\\$ " /bin/bash' > ~/.bash_profile && echo "set +h umask 022 export LFS=$LFS export SRC=$LFS/data export PATH=/www/bin:/bin:/usr/bin export LC_ALL=C TZ=UTC export CFLAGS='-DNDEBUG -O3 -finline-limit=200 -fomit-frame-pointer -pipe -fno-bounds-check -freg-struct-return -march=athlon-xp' export LDFLAGS='-s -Wl,-O1,-s,--enable-new-dtags,--hash-style=gnu' export kLDFLAGS='-O1 --enable-new-dtags --hash-style=gnu' alias make='make -j1' mkdir='mkdir -p' patch='patch -p1 -i' mv='mv -f' cp='cp -pf' rm='rm -fr' cd \$SRC" > ~/.bashrc && source ~/.bash_profile
为了尽可能使工具链与后面编译的最终系统兼容,这里在工具链阶段就使用相同的优化参数进行编译(pass1例外),不过由于宿主系统的影响,这样做可能会导致很多测试失败,所以工具链阶段仅对Glibc/GCC/Binutils进行测试,并且忽略Glibc/GCC测试错误(只记录测试信息)。[说明]kLDFLAGS是专供内核使用的连接器参数(直接传递给ld)。
编译过程是一个漫长的冒险,特别是在使用了一大堆configure选项和优化参数的情况下,出现错误是再正常不过的事情了。本文的所有代码都在我的CPU上测试通过,因为我没有更多的CPU,所以无法进行更多的测试,但是一个基本原则就是,一旦遇到编译或测试错误,首先想到的应当就是降低优化级别,看看能不能通过。理论上,将本文所有的"athlon-xp"都替换成"i686",并且设置 CFLAGS="-O2 -fomit-frame-pointer -pipe -march=i686" LDFLAGS="-s" kLDFLAGS="",应当可以在目前实际使用的所有 x86 CPU 上顺利完成。如果降低优化级别仍然不能解决问题,那么可以继续调整configure选项。
下面这些优化选项可能是地雷,尽量不要使用,如果你喜欢冒险,并且不小心踩到了,别怪我没提醒过你.....
CFLAGS
"-D_FILE_OFFSET_BITS=64 -fvisibility=hidden; -malign-double; -mregparm=3; -msseregparm; -ftracer; --param max-gcse-memory=100M; --param max-gcse-passes=3; -Wa,-R; -Wa,-march=athlon"至少会导致Glibc配置或编译失败。"-m128bit-long-double"会导致GCC的gcc.dg/pr19402-2.c测试失败,Glibc的math/test-misc.out测试失败,autoconf的AC_PROG_SED测试失败,tar的31/33/35号测试失败。"-freg-struct-return"虽然能让Glibc通过测试但却会间接导致GCC的gcc.dg/struct-ret-libc.c测试失败,这是二进制兼容性所致,一般可以忽略它。"-ftree-loop-linear"会导致PostgreSQL无法运行测试程序(无法初始化数据库),还会导致JPEG测试失败。
LDFLAGS
"--as-needed"将导致Glibc的stdlib,nptl,elf测试出现多处错误,"-znow"将导致Glibc的elf测试出现多处错误。"--sort-common"会导致Automake的ccnoco.test测试失败(直接和间接原因都有??)。
kLDFLAGS
"-s"会导致内核编译失败。