免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 987 | 回复: 0
打印 上一主题 下一主题

LFS心得(LFS系列三) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-13 11:52 |只看该作者 |倒序浏览
二.构建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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP