用了三天,编译了两次LFS,把LFS的基本流程和原理都弄清了。用的是LFS 6.3,使用的教程是LFS速成手册(6.3) ,感觉很不错,如果按照它的做法,一步一步来,基本都能编译成功而且没什么错误。不过做LFS的目的就是学习,如果没有错误,也就起不到学期的目的的。
1.LFS会多次编译binutils,gcc和glibc,原因是令目标系统消除与宿主系统的关系,这里的宿主系统是指liveCD的系统,目标系统是指我们做LFS最终编译出来的系统。引用网上的人的说法:宿主系统就像是母体,目标系统像它的儿子,对这个母体,那是既爱又恨呀,没有她,目标无从生起,有了她,就有了她的血(glibc提供的库)和肉(那套编译工具)。所以lfs中需要多次编译binutils,gcc和glibc,以令目标系统消除与宿主系统的关系。
2.首先介绍一下binutils,gcc和glibc:Binutils 是一组开发工具,包括连接器,汇编器和其它用于目标文件和档案的工具。GCC 软件包包含 GNU 编译器,其中有 C 和 C++ 编译器。 Glibc 包含了主要的C库。这个库提供了基本的例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等等。其它的工具必须在他们的基础上建立。
3.制作工具链的精髓是在.bashrc里面的PATH=/tools/bin:/bin:/usr/bin,原理是首先去/tools/bin(这是我们创建的目录)找工具,没有就去/bin,/usr/bin(这两个是宿主系统的目录),开始编译时由于/tools/bin没有工具,所以会使用宿主系统的工具,编译成功后,/tools/bin就有工具了,然后再次编译,编译就会使用之前编译的工具。从而逐渐减少,最后消除与宿主系统的关系。
4.chroot "$LFS" /tools/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h进入chroot环境 这里这是/mnt/lfs(即"$LFS")为默认的根目录。PATH设置为优先去lfs目录下的bin等目录找工具,最后才是/tools/目录,跟第3点的设置类似。
5.LFS编译的步骤以及原理:
步骤 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
编译的软件 |
binutils(第一遍)
| gcc(第一遍) |
glibc(第一遍)
| 调整工具链,由/lib/ld-linux.so.2改到/tools/lib/ld-linux.so.2 |
gcc(第二遍)
|
|
,Bash ,Bzip2 ,Coreutils ,Diffutils ,Findutils ,Gawk ,Gettext ,Grep ,Gzip,Make,Patch,Perl,Sed,Tar,Texinfo,Util-linux |
编译的目标目录
| /tools |
/tools
|
/tools
|
/tools
|
/tools
| ||
使用谁的工具 |
宿主系统
|
宿主系统
|
宿主系统
|
/tools
|
/tools
| ||
步骤 | 8 | 9 | 10 | 11 | 12 | 13 | |
编译的软件 |
| glibc(第二遍) | 调整工具链,由/tools/lib/ld-linux.so.2改到/lib/ld-linux.so.2(这里的/lib与第一次调整时的/lib不同,因为chroot改变了根目录的位置,这里的/lib是指向目标系统的) |
|
gcc(第三遍)
| 至此目标系统的编译工具编译完成,下面的软件都用目标系统的编译工具进行编译 | |
编译的目标目录
| /usr | /usr | /usr | ||||
使用谁的工具 |
/tools
|
目标系统
|
目标系统
|
6.LFS过程中遇到的问题: