LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 817|回复: 1

Lfs6.2.4编译文档(主要是对比6.1文档的不同部分)

[复制链接]
发表于 2007-2-11 23:32:18 | 显示全部楼层 |阅读模式
修改日志:
2007-2-11 加入第五章的内容
2007-2-12 加入第六章部分内容

我第一次编译lfs时并没有很深入地参照手册,而是参考了youbest的文章。当我编译完了第一次的lfs后,今天尝试编译较新的LFS版本,由于youbest的文章有一些地方并不合适liveCD        LFS6.2.4。所以我还是参照手册来做。

由于youbest的文章已经相当的详细。所以我现在只是写6.2和6.1有分别的部分,给新手参考的。其它部分可以参考youbest的《[原创]手把手教你如何建立自己的Linux系统(LFS速成手册)》,当然最后你还是要参考LFS手册。

由于文章较花时间,我是一边根据手册编译,一边写的。所以不能一次写完。并有可能有一些遗漏。感觉上6.2比6.1有较大的改进。
一、第五章
1.5.3. Binutils-2.16.1 - 第一遍
由于采用了2.16的稳定版本,不需要打补丁。
编译后执行
[color="Red"]cp –v ld/ld-new /tools/bin
安装后可以将目录删除。

2.5.6. Glibc-2.3.6
使用glibc2.3.6 时不需要再打上补丁。

3.5.7. 第一次调整工具链
这里的第一次调整工具链和6。1时有较大的分别,请务必要注意
[color="Red"]mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
从现在开始,所有程序都将连接到 /tools/lib 中的库文件。接着做的是修正 GCC 的"specs"文件,使它指向新的动态连接器。
[color="Red"]SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs &&
gcc -dumpspecs > $SPECFILE &&
sed 's@^/lib/ld-linux.so.2@/tools&@g' $SPECFILE > tempspecfile &&
mv -vf tempspecfile $SPECFILE &&
unset SPECFILE
把所有的"/lib/ld-linux.so.2"都替换成"/tools/lib/ld-linux.so.2"就行了
运行下面的命令删除 GCC 专属头文件目录中的头文件
[color="Red"]GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
unset GCC_INCLUDEDIR
4.5.8. Tcl-8.4.13
安装 Tcl 头文件,下一个包(Expect)要使用 Tcl 的头文件。
[color="Red"]make install-private-headers

5.5.11. GCC-4.0.3 - 第二遍
通过下面的命令来禁止 fixincludes 脚本运行:
[color="Red"]cp -v gcc/Makefile.in{,.orig} &&
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
在第一次编译gcc进行的 bootstrap 编译使用了 -fomit-frame-pointer 选项,而非 bootstrap 编译则默认忽略了该选项,所以需要使用下面的 sed 命令来确保在非 bootstrap 编译时也同样使用 -fomit-frame-pointer 选项,以保持一致性:
[color="Red"]cp -v gcc/Makefile.in{,.tmp} &&
sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
  > gcc/Makefile.in

6. Binutils-2.16.1 - 第二遍
在第二次编译binutils时要注意,confugure的参数里少了一个.—enable-shared
[color="Red"]../binutils-2.16.1/configure --prefix=/tools \
    --disable-nls --with-lib-path=/tools/lib
和第一次编译时一样,所有完成后执行
cp -v ld/ld-new /tools/bin
后可以删除整个目录

7. 5.19. Gawk-3.1.5
由于 configure 脚本的一个 bug ,Gawk 不能正确检测某些 Glibc 支持的 locale ,这将会导致一些问题,比如,Gettext 的测试程序会失败。修复这个 bug 的办法是在 config.h 文件结尾追加丢失的宏定义:
[color="Red"]cat >>config.h <<"EOF"
#define HAVE_LANGINFO_CODESET 1
#define HAVE_LC_MESSAGES 1
EOF

8. 5.20. Gettext-0.14.5
对于临时工具链来说,我们只需要编译和安装 Gettext 中的一个二进制文件即可。为编译 Gettext 做准备:
cd gettext-tools
./configure --prefix=/tools --disable-shared
编译软件包:
make -C lib
make -C src msgfmt
因为只编译了一个二进制文件,所以无法运行测试套件。并且我们也不推荐在此时运行测试。安装编译好的二进制文件 msgfmt :
cp -v src/msgfmt /tools/bin

9. 5.26. Perl-5.8.8
原来是5.87
./configure.gnu --prefix=/tools -Dstatic_ext='IO Fcntl POSIX'
在5.88里改为如下:
[color="Red"]./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'

先写完第五章。。。。。。。明天续着写。

第六章
10. 6.2. 挂载虚拟内核文件系统
在挂载并填充/dev时使用到了绑定挂载。在这里虽然和6.1是有不同,但是差不多的。感觉6.2在很多地方都有了改进。
建立挂载目录:
[color="Red"]mkdir -pv $LFS/{dev,proc,sys}
创建初始设备节点:
[color="Red"]mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
挂载并填充 /dev 目录
[color="Red"]mount --bind /dev $LFS/dev
挂载虚拟内核文件系统
[color="Red"]mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

11. 6.4. 进入 Chroot 环境
这里一定要注意,6.2的liveCD和6.1有些不同,不能使用mount /dev/cdrom $LFS/cdrom这样的方式,必须在chroot前将代码包复制到$LFS的目录,推荐放到$LFS/source下。当时我就是在这里出了问题。Chroot后一看,原来CD里没有代码的压缩包。

12. 6.5. 创建系统目录结构
6.2中创建目录结构其中和6.1是相同的,不过6.2的看起来更好一点。结果是一样的,只是比较精简一点。
[color="Red"]mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
  ln -sv share/{man,doc,info} $dir
done
mkdir -v /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

13. 6.7. Linux-Libc-Headers-2.6.12.0
Linux-Libc-Headers 包含"纯净的"内核头文件。在这里需要打一个补丁,添加一个用户空间头文件和新内核对于inotify特性的系统调用支持。在6.1不用打补丁的。
[color="Red"]patch -Np1 -i ../linux-libc-headers-2.6.12.0-inotify-3.patch

14. 6.9. Glibc-2.3.6
Glibc要打三个补丁:
glibc-libidn这个包加上了对国际化域名(IDN)的支持到Glibc中。解压缩包到Glibc的源码目录:
[color="Red"]tar -xf ../glibc-libidn-2.3.6.tar.bz2
patch -Np1 -i ../glibc-2.3.6-linux_types-1.patch
patch -Np1 -i ../glibc-2.3.6-inotify-1.patch
下面两条命令一条修正一个bug,一条是防止编译时使用了/tools的目录。
[color="Red"]sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
sed -i \
's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
scripts/test-installation.pl


                                                 作者:juwen
                                                                                               邮箱:juwen.zhong@gmail.com
                                                                                                 时间:2007-2-11
发表于 2007-2-12 00:14:25 | 显示全部楼层
好文章,我正在 Lfs6.2.3的编译中呢,也是一边看官方文档一边看youbest大哥的文章哈!
这篇虽然是6.2.4的,但应该和我的差别不大,有参考价值!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表