- 论坛徽章:
- 0
|
二.构建LFS系统中的几个重点
1. 工具链(Toolschain)
工具链包括binutils,gcc,glibc三个软件包(LFS中还包括了linux-headers头文件包)。
Binutils主要是ld链接程序,gas汇编程序等。
Glibc提供了C的主要函数库。
Gcc是GNU的编译程序,提供C和C++的编译程序,然后会调用ld程序将用户的代码与glibc链接起来或将glibc提供的函数静态链接到用户程序中,生成最终的可执行程序。
在LFS的准备阶段(第5章),为了建立一个纯粹的工具链,gcc和binutils通常需要生成两次。第一次是利用宿主机中原有的gcc,glibc和ld等工具,建立半成品的gcc和ld。利用这半成品的编译链接程序,编译出纯净的glibc库。
然后利用半成品的gcc和成品glibc,先做了成品binutils,再做了成品的gcc。
此时整个工具链就纯净了,与宿主机中的编译程序没有了任何关系。以后利用这个工具链生成的软件也都是纯净的,也就是说这些生成的软件全部调用/tools/lib目库下的文件,与宿主机中的/lib目录没有任何关系。
在LFS的第6章也是同样道理,通过重新编译工具链,再使得生成的软件脱离/tools的干扰。
2.路径(Path)
LFS中路径的设置是非常重要的,如果忽略这个问题会给整个过程带来很大的麻烦。
我说的路径一个是环境变量$PATH,一个是软件生成过程中需要设置的路径。
环境变量$PATH在准备阶段(第4章)中设置为/tools/bin:/bin:/usr/bin,并且取消了路径的hash表查找(+h),这样如果在/tools/bin目录下生成了新的软件,就会开始使用这个新的软件,如果没有则会在老系统的/bin和/usr/bin目录下寻找。例如在生成gcc之前,使用的是宿主机中的gcc,而一旦在/tools/bin下生成了gcc,以后再编译软件包,就会使用/tools/bin下的gcc程序。
我在第一次做LFS时由于没有重视这个问题,足足被阻挡了2天才找到原因(见我在论坛写的关于forced unwind support的帖子)。
在第6章中,则将这个过程反过来,设置PATH=/bin:/usr/bin:/tools/bin,将/tools/bin目录放在查找路径的最后。
不过,这里的/bin目录和原来老系统的/bin不是同一个目录,因为利用chroot命令改变了linux系统的根目录,在执行chroot后,linux提供了一个虚拟的环境,这个环境下的根目录是原linux系统的一个子目录(/mnt/lfs)而已。在这个虚拟环境中,已经完全无法访问宿主系统的/mnt/lfs以外的目录了。这也是为什么LFS会在一开始在根目录下建立/tools软链接的原因,这样在真实环境和虚拟环境下,对/tools目录的访问是同一个目录。
软件生成过程中大部分软件通过设置prefix选项确定生成路径。准备阶段的软件路径全部以/tools目录为基准,正式生成阶段的软件路径全部以/usr目录为基准(个别软件除外)。
gcc,binutils除了需要确定自己的生成路径,还需要决定其它软件的函数库引用路径,gcc的路径是通过补丁来设置的,binutils是通过LIB_PATH选项。这步没有做好,以后所有软件的生成工作可能都白费了。
3.补丁(Patch)
LFS的过程中需要打各种补丁,这些补丁大致可以分为三类。
一类是修改软件中存在的bug,这类补丁文件的名称中通常含有fixes,这种补丁是必须要打上的,否则很可能编译时出现错误,或以后运行中出现错误。
一类是增强软件的功能,这类补丁在文件名称中会含有功能的名称。用户如果不需要这项功能,可以不安装这个补丁。
还有一类是由于特殊需要,对源代码作一些修改,但又不方便使用sed命令的,这时LFS会提供一个patch文件,方便用户修改。这类补丁也是必须要打上的,通常patch文件中会含有specs。
如果你是完全使用LFS建议得软件,那最好严格按照LFS文档的要求打上patch。
Jhalfs手动修改--------------------------
关于sudo
设置lfs的sudo密码
代码:
sudo passswd lfs
修改/etc/sudoers
代码:
chmod 660 sudoers;加入写入属性
代码:
vi sudoers加入下面语句
lfs ALL=(ALL) ALL
代码:
chmod 440 sudoers---------------------------
代码:
cd /home/jhalfs/jhalfs2.0make 创建.config文件
-----------------
2. 设定 profile
2.1 编辑 ~/jhalfs-trunk/common/config,按自己需要修改(基本都有说明的):
BUILDDIR=/mnt/lfs
...
GETPKG=1
...
SERVER=http://ftp.osuosl.org (取一个较快的 mirror)
...
OPTIMIZE=1
...
TEST=0 (我习惯全程不 TEST 的)
STRIP=1
PAGE=A4
GETKERNEL=1
BOOK=/usr/share/LFS-BOOK-6.2-XML
export SRC_ARCHIVE=/lfs-sources && ./lfs -G –M (非必须)
2.2 编辑 ~/jhalfs-trunk/optimize/opt_config,按自己需要修改(若对优化设置不熟识,请勿使用):
...
DEF_OPT_MODE=O3pipe_march (也可自行定义一个 O2pipe 来用)
...
另外, ~/jhalfs-trunk/optimize/opt_override 是针对某些包(如 binutils, gcc, glibc 等)来作特定的 CFLAGS 设置,基本上不用改动
2.3 编辑 ~/jhalfs-trunk/optimize/opt_config.d/O3pipe_march
可修改所有 -march 及加入 -fomit-frame-pointer
3. 准备编译
在 jhalfs-trunk 目录下有几个 symlink 来击活 master.sh 此脚本,分别是 lfs,blfs,clfs 及 hlfs,故名思义了。master.sh 本身不能单独启用,必需由该命令来决定要建立的系统。
现在我要做 LFS,当然就是执行 ./lfs 了,在 jhalfs-trunk 目录下执行
#export SRC_ARCHIVE=/lfs-sources && ./lfs
其间,系统会要求你核对编译设置及优化条件,接着系统会先行下载最新的 SVN BOOK 内各章节对应的 xml 文件来产生所需的 Makefile,(将会存放在 /mnt/lfs/jhalfs 内),系统会检查 /lfs-sources 内有没有所需的包,缺少的包及补丁自动从先前指定的 mirror下载。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49674/showart_399867.html |
|