【LFS之步步为营】【四】



【引言:一边复习一边推进学习,逐渐了解整个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链接了。

 






你可能感兴趣的:(Linux)