制作工具链前的准备工作

优质
小牛编辑
128浏览
2023-12-01

使用 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"会导致内核编译失败。