【引言:一边复习一边推进学习,逐渐了解整个LFS过程框架,希望进度还可以加快。】
本节主要介绍如何利用已完成的工具链去编译构建其它基本的工具,从而完成整个临时系统的构建,为后面构建真正的LFS系统完成操作平台。
首先关于如何恢复工作状态?
到此,已经成功完成了工具链的编译,当虚拟机关机后,运行在内存中的Linux系统自然关机,之前依赖系统的操作都将丢失,而我们所完成的工具链是存储在之前的分区sda1中,所以要想再次恢复到之前的工作状态就需要在新启动的系统上完成之前的预备操作,具体如下:
从LiveCD重启虚拟机;
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/sda1 $LFS
ln -sv $LFS/tools /
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
su - lfs
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
source .bash_profile
export
输出:
declare -x HOME="/home/lfs"
declare -x LC_ALL="POSIX"
declare -x LFS="/mnt/lfs"
declare -x OLDPWD
declare -x PATH="/tools/bin:/bin:/usr/bin"
declare -x PS1="\\u:\\w\\\$ "
declare -x PWD="/home/lfs"
declare -x SHLVL="1"
declare -x TERM="linux"
基本上就恢复工作状态了。
cd $LFS/sources
现在就继续临时系统的搭建 ~~
4.1 第二遍 Binutils (20分钟)
tar xvf /lfs-sources/binutils-2.17.tar.bz2
mkdir -v binutils-build
cd binutils-build
../binutils-2.17/configure --prefix=/tools --disable-nls --with-lib-path=/tools/lib
参数说明:
--with-lib-path=/tools/lib 告诉 configure脚本在 Binutils编译过程中将传递给连接器的库搜索路径设为 /tools/lib,
以防止连接器搜索宿主系统的库目录。
make
make install
make -C ld clean 该参数告诉 make程序,删除 ld子目录下所有已编译的文件;
make -C ld LIB_PATH=/usr/lib:/lib 该参数重新编译 ld子目录下的所有文件;
cp -v ld/ld-new /tools/bin
cd ..
rm -rf binutils-build binutils-2.17
4.2 第二遍 GCC (30分钟)
tar xvf /lfs-sources/gcc-4.1.2.tar.bz2
cd gcc-4.1.2
patch -Np1 -i /lfs-sources/gcc-4.1.2-specs-1.patch
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
说明:在正常条件下,运行GCC的 fixincludes 脚本,是为了修复可能损坏的头文件,但这里需要抑制 fixincludes 脚本的运行;
cp -v gcc/Makefile.in{,.tmp} 备份Makefile;
sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
说明:
mkdir -v ../gcc-build
cd../gcc-build
../gcc-4.1.2/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-bootstrap
参数说明:
--enable-clocale=gnu 本参数确保C++库在任何情况下都使用正确的 locale模块;
--enable-threads=posix 使 C++异常能处理多线程代码;
--enable-__cxa_atexit 本参数允许用 __cxa_atexit代替 atexit来登记 C++对象的本地静态和全局析构函数,
这是为了完全符合标准对析构函数的处理规定;
--enable-languages=c,c++ 本参数确保编译 C和 C++语言的编译器;
--disable-libstdcxx-pch 不为 libstdc++编译预编译头(PCH),它占用了很大空间,并且我们用不到它;
--disable-bootstrap 对于本地编译GCC,默认是进行"bootstrap"编译。这不仅仅是编译GCC,而且要编译好几次;
它用第一次编译的程序再次编译它自己,然后再第三次编译。第二次和第三次迭代比较来确保
重新生成完美的自己。然而,LFS系统创建方法应该提供一个可信赖的无需每次引导编译器。
make
make install
cd ..
rm -rf gcc-build gcc-4.1.2
现在需要再次确认GCC的基本功能(编译和连接)是否按预期工作,做一个简单的合理性检查:
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep 'tools'
查看a.out的依赖库,输出大致如下则成功:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
rm -rfa.out dummy.c
4.3 安装Tcl Expect Dejagnu (10分钟)
Tcl 软件包包含工具命令语言(Tool Command Language),这个软件包和接下来安装的两个软件包(Expect 和 DejaGNU)是为了给运行 GCC 和 Binutils 的测试程序提供支持。
tar xvf /lfs-sources/tcl8.4.15-src.tar.gz
cd tcl8.4.15/unix/
./configure --prefix=/tools
make
make install
make install -private-headers
ln -sv tclsh8.4 /tools/bin/tclsh
cd $LFS/sources
Expect 软件包包含一个通过执行脚本对话框与其它交互式程序通信的工具。
tar xvf /lfs-sources/expect-5.43.0.tar.gz
cd expect-5.43/
patch -Np1 -i /lfs-sources/expect-5.43.0-spawn-1.patch
cp configure{,.bak}
sed 's:/usr/local/bin:/bin:' configure.bak > configure
./configure --prefix=/tools --with-tcl=/tools/lib --with-tclinclude=/tools/include --with-x=no
参数说明:
--with-tcl=/tools/lib 确保配置脚本找到的是安装在临时工具目录下的 Tcl,而不是宿主系统里的;
--with-tclinclude=/tools/include 告诉 Expect到哪里寻找 Tcl的内部头文件;
--with-x=no 告诉 configure脚本不要搜索 Tk(Tcl的图形界面组件)或者 X Window系统的库,
这两者都可能位于宿主系统上,而不在临时环境中。
make
make SCRIPTS="" install
cd $LFS/sources
DejaGNU软件包包含了一个测试其它程序的框架。
tar xvf /lfs-sources/dejagnu-1.4.4.tar.gz
cd dejagnu-1.4.4
./configure --prefix=/tools
make install
cd ..
rm -rf tcl8.4.15 expect-5.43 dejagnu-1.4.4
4.4 Ncurses
tar xvf /lfs-sources/ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/tools --with-shared --without-debug --without-ada --enable-overwrite
参数说明:
make
make install
cd ..
rm -rf ncurses-5.6
4.5 Bash
tar xvf /lfs-sources/bash-3.2.tar.gz
cd bash-3.2
patch -Np1 -i /lfs-sources/bash-3.2-fixes-5.patch
./configure --prefix=/tools --without-bash-malloc
make
make install
ln -vs bash /tools/bin/sh
cd ..
rm -rf bash-3.2
4.6 Bzip
tar xvf /lfs-sources/bzip2-1.0.4.tar.gz
cd bzip2-1.0.4
make
make PREFIX=/tools install
cd ..
rm -rf bzip2-1.0.4
4.7 Coreutils
tar xvf /lfs-sources/coreutils-6.9.tar.bz2
cd coreutils-6.9
./configure --prefix=/tools
make
make install
cp -vs rc/su /tools/bin/su-tools
cd ..
rm -rf coreutils-6.9
4.8 Diffutils
tar xvf /lfs-sources/diffutils-2.8.1.tar.gz
cd diffutils-2.8.1
./configure --prefix=/tools
make
make install
cd ..
rm -rf diffutils-2.8.1
4.9 Findutils
tar xvf /lfs-sources/findutils-4.2.31.tar.bz2
cd findutils-4.2.31
./configure --prefix=/tools
make
make install
cd ..
rm -rf findutils-4.2.31
4.10 Gawk
tar xvf /lfs-sources/gawk-3.1.5.tar.bz2
cd gawk-3.1.5
./configure --prefix=/tools
cat >> config.h << "EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF
make
make install
cd ..
rm -rf gawk-3.1.5
4.11 Gettext
tar xvf /lfs-sources/gettext-0.16.1.tar.gz
cd gettext-0.16.1
cd gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -vs rc/msgfmt /tools/bin
cd $LFS/sources
rm -rf gettext-0.16.1
4.12 Grep
tar xvf /lfs-sources/grep-2.5.1a.tar.bz2
cd grep-2.5.1a
./configure --prefix=/tools --disable-perl-regexp
make
make install
cd ..
rm -rf grep-2.5.1a
4.13 Gzip
tar xvf /lfs-sources/gzip-1.3.12.tar.gz
cd gzip-1.3.12
./configure --prefix=/tools
make
make install
cd ..
rm -rf gzip-1.3.12
4.14 Make
tar xvf /lfs-sources/make-3.81.tar.bz2
cd make-3.81
./configure --prefix=/tools
make
make install
cd ..
rm -rf make-3.81
4.15 Patch
tar xvf /lfs-sources/patch-2.5.4.tar.gz
cd patch-2.5.4
./configure --prefix=/tools
make
make install
cd ..
rm -rf patch-2.5.4
4.16 Perl
tar xvf/lfs-sources/perl-5.8.8.tar.bz2
cd perl-5.8.8
patch -Np1 -i /lfs-sources/perl-5.8.8-libc-2.patch
./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perlutilities
cp -vp erl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.8.8
cp -Rv lib/* /tools/lib/perl5/5.8.8
cd ..
rm -rf perl-5.8.8
4.17 Sed
tar xvf /lfs-sources/sed-4.1.5.tar.gz
cd sed-4.1.5
./configure --prefix=/tools
make
make install
cd ..
rm -rf sed-4.1.5
4.18 Tar
tar xvf /lfs-sources/tar-1.18.tar.bz2
cd tar-1.18
./configure --prefix=/tools
make
make install
cd ..
rm -rf tar-1.18
4.19 Textinfo
tar xvf /lfs-sources/texinfo-4.9.tar.bz2
cd texinfo-4.9
./configure --prefix=/tools
make
make install
cd ..
rm -rf texinfo-4.9
4.20 Util-linux
tar xvf /lfs-sources/util-linux-2.12r.tar.bz2
cd util-linux-2.12r
sed -i 's@/usr/include@/tools/include@g' configure
./configure
make -C lib
make -C mount mount umount
make -C text-utils more
cp -v mount/{,u}mount text-utils/more /tools/bin
cd ..
rm -rf util-linux-2.12r
exit
到目前为止,工具链已经制作完成了,接着就要开始制作真正的目标系统了,如果你到目前为止没出什么问题,那么恭喜你成功的通过了一关,不过接着还有相当长的路。
现在你应该是处于root用户状态的,看看你的命令行提示符是不是回到了#。
这个时候也许你想睡觉关机了,那么重新开机后回到工作状态的步骤是:
1.重新启动计算机,并从LiveCD启动
2.加载分区
export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/hda2 $LFS
3.加载交换分区(如果不想用交换分区或者没有交换分区可跳过此步骤)
swapon /dev/hda1
相关知识点:
这时候已经制作好了工具链,因此可以不需要建立根目录下的tools链接了。