一步一步打造自己的Linux--LFS6.3安装过程(四)
一步一步打造自己的Linux--LFS6.3安装过程(六)

一步一步打造自己的Linux--LFS6.3安装过程(五)

獨立的圓 posted @ 2008年2月10日 20:57 in Linux with tags LFS , 8877 阅读

 本站文章已轉移,敬請移步:http://www.xxb.me/ ,謝謝!

(注:本文于2月29日修改)

由于之前我把源代码链接到$LFS/sources了,所以:

  1. $ export LFS=/sources

然后进入编译目录:

  1. $ cd /sources

linux-2.6.22.5   (5分钟)

  1. $ tar xvf $LFS/linux-2.6.22.5.tar.bz2
  2. $ cd linux-2.6.22.5
  3. $ sed -i '/scsi/d' include/Kbuild
  4. $ make mrproper
  5. $ make headers_check
  6. $ make INSTALL_HDR_PATH=dest headers_install
  7. $ cp -rv dest/include/* /usr/include
  8. $ cd ..
  9. $ rm -rf linux-2.6.22.5

man-pages   (5分钟)

  1. $ tar xvf $LFS/man-pages-2.63.tar.bz2
  2. $ cd man-pages-2.63
  3. $ make install
  4. $ cd ..
  5. $ rm -rf man-pages-2.63

glibc-2.5.1   (40分钟)

  1. $ tar xvf $LFS/glibc-2.5.1.tar.bz2
  2. $ cd glibc-2.5.1
  3. $ tar xvf $LFS/glibc-libidn-2.5.1.tar.gz
  4. $ mv glibc-libidn-2.5.1 libidn
  5. $ sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
  6. $ sed -i \
    's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' \
            scripts/test-installation.pl
  7. $ sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
  8. $ mkdir -v ../glibc-build
  9. $ cd ../glibc-build
  10. $ ../glibc-2.5.1/configure --prefix=/usr \
        --disable-profile --enable-add-ons \
        --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
  11. $ make
  12. $ make -k check 2>&1 | tee glibc-check-log
  13. $ grep Error glibc-check-log   #这里难免报点错误,一般可以忽略
  14.  
  15. $ touch /etc/ld.so.conf
  16. $ make install
  17. $ cd ..
  18. $ rm -rf glibc-2.5.1 glibc-build

单个的locale可以通过使用localedef 程序来安装.下面的说明将会安装一个所需locale的最小集合:

  1. $ mkdir -pv /usr/lib/locale
  2. $ localedef -i de_DE -f ISO-8859-1 de_DE
  3. $ localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
  4. $ localedef -i en_HK -f ISO-8859-1 en_HK
  5. $ localedef -i en_PH -f ISO-8859-1 en_PH
  6. $ localedef -i en_US -f ISO-8859-1 en_US
  7. $ localedef -i en_US -f UTF-8 en_US.UTF-8
  8. $ localedef -i es_MX -f ISO-8859-1 es_MX
  9. $ localedef -i fa_IR -f UTF-8 fa_IR
  10. $ localedef -i fr_FR -f ISO-8859-1 fr_FR
  11. $ localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
  12. $ localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
  13. $ localedef -i it_IT -f ISO-8859-1 it_IT
  14. $ localedef -i ja_JP -f EUC-JP ja_JP

如果想加入中文的locale,就用:

  1. $ mkdir -pv /usr/lib/locale
  2. $ localedef -i zh_CN -f GB18030 zh_CN
  3. $ localedef -i zh_CN -f GBK zh_CN
  4. $ localedef -i zh_CN -f UTF-8 zh_CN
  5. $ localedef -i zh_CN -f GB2312 zh_CN
  6. $ localedef -i zh_HK -f UTF-8 zh_CN
  7. $ localedef -i zh_HK -f BIG5-HKSCS zh_CN
  8. $ localedef -i zh_TW -f EUC-TW zh_CN
  9. $ localedef -i zh_TW -f UTF-8 zh_CN
  10. $ localedef -i zh_TW -f BIG5 zh_CN

如果想一次安装所有的locales,利用下面的命令:

  1. $ make localedata/install-locales

配置Glibs:

  1. $ cat > /etc/nsswitch.conf << "EOF"
  2. # Begin /etc/nsswitch.conf
  3.  
  4. passwd: files
  5. group: files
  6. shadow: files
  7.  
  8. hosts: files dns
  9. networks: files
  10.  
  11. protocols: files
  12. services: files
  13. ethers: files
  14. rpc: files
  15.  
  16. # End /etc/nsswitch.conf
  17. EOF

设置时区,这里需要手动选择, 依次为 5) Asia---> 9) China ---> 1) east China - Beijing, Guangdong, Shanghai, etc.--->1) Yes

  1. $ tzselect

创建 /etc/localtime 文件:将 <xxx> 替换成选择的时区的名称(比如,Asia/Shanghai)。

  1. $ cp -v --remove-destination /usr/share/zoneinfo/<xxx> \
  2.     /etc/localtime

配置动态链接库加载程序:

  1. $ cat > /etc/ld.so.conf << "EOF"
  2. # Begin /etc/ld.so.conf
  3.  
  4. /usr/local/lib
  5. /opt/lib
  6.  
  7. # End /etc/ld.so.conf
  8. EOF

再次调整工具链

  1. $ mv -v /tools/bin/{ld,ld-old}
  2. $ mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
  3. $ mv -v /tools/bin/{ld-new,ld}
  4. $ ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

修正 GCC 的 specs 文件,使它指向新的动态链接器:

  1. $ gcc -dumpspecs | sed \
        -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' \
        -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
        -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
        `dirname $(gcc --print-libgcc-file-name)`/specs   #注意`和‘的区别

检查新工具链的基本功能(编译和连接)是否正常:

  1. *$ echo 'main(){}' > dummy.c
  2. *$ cc dummy.c -v -Wl,--verbose &> dummy.log
  3. *$ readelf -l a.out | grep ': /lib'

最后一个命令的结果应该是(某些特殊平台上动态连接器的名称可能与此处不同):

[Requesting program interpreter: /lib/ld-linux.so.2]

确保设置使用正确的开始文件:

  1. **$ grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log   #[1in],注意这里是1不是l

命令的结果应该是:

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
  1. ***$ grep -B1 '^ /usr/include' dummy.log

结果应为:

#include <...> search starts here:   #我少了这行,应该不要紧
 /usr/include

验证新的链接器是否在正确的搜索路径内:

  1. ****$ grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

结果应为:

SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");

确保正在使用正确的 libc:

  1. *$ grep "/lib/libc.so.6 " dummy.log

结果应为:

attempt to open /lib/libc.so.6 succeeded

最后,确保 GCC 正在使用正确的动态链接器:

  1. *$ grep found dummy.log

结果应为:

found ld-linux.so.2 at /lib/ld-linux.so.2

在确定一切正常后,删除测试文件:

  1. *$ rm -v dummy.c a.out dummy.log

测试一下在 chroot 环境中,伪终端(PTY)是否正常工作:

  1. $ expect -c "spawn ls"

如果看到这样的输出:

The system has no more ptys.
Ask your system administrator to create more.

说明chroot环境还没有设置好 PTY,这时运行 Binutils 和 GCC 的测试套件就没有意义了,必须先解决 PTY 设置。(怎样解决我也不知道,google吧!网上有人说解决的话要重新编译宿主系统的内核,不管它也可以,大不了不运行测试套件)

我的正常工作,输出:

spawn ls

binutils-2.17   (15分钟)

  1. $ tar xvf $LFS/binutils-2.17.tar.bz2
  2. $ mkdir -v binutils-build
  3. $ cd binutils-build
  4. $ ../binutils-2.17/configure --prefix=/usr \
        --enable-shared
  5. $ make tooldir=/usr
  6. $ make check   #这里check应该不会报错
  7. $ make tooldir=/usr install
  8. $ cp -v ../binutils-2.17/include/libiberty.h /usr/include
  9. $ cd ..
  10. $ rm -rf binutils-2.17 binutils-build

gcc-4.1.2   (30分钟,不含mack check)

  1. $ tar xvf $LFS/gcc-4.1.2.tar.bz2
  2. $ cd gcc-4.1.2
  3. $ sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
  4. $ sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
  5. $ sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
  6. $ sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
  7. $ mkdir -v ../gcc-build
  8. $ cd ../gcc-build
  9. $ ../gcc-4.1.2/configure --prefix=/usr \
        --libexecdir=/usr/lib --enable-shared \
        --enable-threads=posix --enable-__cxa_atexit \
        --enable-clocale=gnu --enable-languages=c,c++
  10. $ make
  11. $ make -k check   #官方说本节的GCC测试套件很重要,任何情况下都不要省略这一步。但我还是跳过了
  12. $ ../gcc-4.1.2/contrib/test_summary
  13. $ make install
  14. $ ln -sv ../usr/bin/cpp /lib
  15. $ ln -sv gcc /usr/bin/cc
  16. $ cd ..
  17. $ rm -rf gcc-4.1.2 gcc-build

现在,最终工具链已经形成了,我们需要做的就是确保编译、链接按照我们希望的完成。接下来再依次运行一遍上面带*号的命令,以确保所有的工作都正常,其中带2个*号的输出应为:

/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o succeeded

带3个*号的命令改为

  1. $ grep -B3 '^ /usr/include' dummy.log

输出应为:

#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
 /usr/include

带4个*号的输出应为:

SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

其余不变。

(未完待续--装LFS真是旷日持久的事情啊)

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter