-
$ export LFS=/sources
一步一步打造自己的Linux--LFS6.3安装过程(四)
一步一步打造自己的Linux--LFS6.3安装过程(五)
一步一步打造自己的Linux--LFS6.3安装过程(六)
(注:本文于2月29日修改)
由于之前我把源代码链接到$LFS/sources了,所以:
-
$ cd /sources
linux-2.6.22.5 (5分钟)
-
$ tar xvf $LFS/linux-2.6.22.5.tar.bz2
-
$ cd linux-2.6.22.5
-
$ sed -i '/scsi/d' include/Kbuild
-
$ make mrproper
-
$ make headers_check
-
$ make INSTALL_HDR_PATH=dest headers_install
-
$ cp -rv dest/include/* /usr/include
-
$ cd ..
-
$ rm -rf linux-2.6.22.5
man-pages (5分钟)
-
$ tar xvf $LFS/man-pages-2.63.tar.bz2
-
$ cd man-pages-2.63
-
$ make install
-
$ cd ..
-
$ rm -rf man-pages-2.63
glibc-2.5.1 (40分钟)
-
$ tar xvf $LFS/glibc-2.5.1.tar.bz2
-
$ cd glibc-2.5.1
-
$ tar xvf $LFS/glibc-libidn-2.5.1.tar.gz
-
$ mv glibc-libidn-2.5.1 libidn
-
$ 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 -
$ sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
-
$ mkdir -v ../glibc-build
-
$ cd ../glibc-build
-
$ ../glibc-2.5.1/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc -
$ make
-
$ make -k check 2>&1 | tee glibc-check-log
-
$ grep Error glibc-check-log #这里难免报点错误,一般可以忽略
-
-
$ touch /etc/ld.so.conf
-
$ make install
-
$ cd ..
-
$ rm -rf glibc-2.5.1 glibc-build
单个的locale可以通过使用localedef 程序来安装.下面的说明将会安装一个所需locale的最小集合:
-
$ mkdir -pv /usr/lib/locale
-
$ localedef -i de_DE -f ISO-8859-1 de_DE
-
$ localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
-
$ localedef -i en_HK -f ISO-8859-1 en_HK
-
$ localedef -i en_PH -f ISO-8859-1 en_PH
-
$ localedef -i en_US -f ISO-8859-1 en_US
-
$ localedef -i en_US -f UTF-8 en_US.UTF-8
-
$ localedef -i es_MX -f ISO-8859-1 es_MX
-
$ localedef -i fa_IR -f UTF-8 fa_IR
-
$ localedef -i fr_FR -f ISO-8859-1 fr_FR
-
$ localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
-
$ localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
-
$ localedef -i it_IT -f ISO-8859-1 it_IT
-
$ localedef -i ja_JP -f EUC-JP ja_JP
如果想加入中文的locale,就用:
-
$ mkdir -pv /usr/lib/locale
-
$ localedef -i zh_CN -f GB18030 zh_CN
-
$ localedef -i zh_CN -f GBK zh_CN
-
$ localedef -i zh_CN -f UTF-8 zh_CN
-
$ localedef -i zh_CN -f GB2312 zh_CN
-
$ localedef -i zh_HK -f UTF-8 zh_CN
-
$ localedef -i zh_HK -f BIG5-HKSCS zh_CN
-
$ localedef -i zh_TW -f EUC-TW zh_CN
-
$ localedef -i zh_TW -f UTF-8 zh_CN
-
$ localedef -i zh_TW -f BIG5 zh_CN
如果想一次安装所有的locales,利用下面的命令:
-
$ make localedata/install-locales
配置Glibs:
-
$ cat > /etc/nsswitch.conf << "EOF"
-
# Begin /etc/nsswitch.conf
-
-
passwd: files
-
group: files
-
shadow: files
-
-
hosts: files dns
-
networks: files
-
-
protocols: files
-
services: files
-
ethers: files
-
rpc: files
-
-
# End /etc/nsswitch.conf
-
EOF
设置时区,这里需要手动选择, 依次为 5) Asia---> 9) China ---> 1) east China - Beijing, Guangdong, Shanghai, etc.--->1) Yes
-
$ tzselect
创建 /etc/localtime 文件:将 <xxx> 替换成选择的时区的名称(比如,Asia/Shanghai)。
-
$ cp -v --remove-destination /usr/share/zoneinfo/<xxx> \
-
/etc/localtime
配置动态链接库加载程序:
-
$ cat > /etc/ld.so.conf << "EOF"
-
# Begin /etc/ld.so.conf
-
-
/usr/local/lib
-
/opt/lib
-
-
# End /etc/ld.so.conf
-
EOF
再次调整工具链
-
$ 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
修正 GCC 的 specs 文件,使它指向新的动态链接器:
-
$ 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 #注意`和‘的区别
检查新工具链的基本功能(编译和连接)是否正常:
-
*$ echo 'main(){}' > dummy.c
-
*$ cc dummy.c -v -Wl,--verbose &> dummy.log
-
*$ readelf -l a.out | grep ': /lib'
最后一个命令的结果应该是(某些特殊平台上动态连接器的名称可能与此处不同):
确保设置使用正确的开始文件:
-
**$ grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log #[1in],注意这里是1不是l
命令的结果应该是:
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
-
***$ grep -B1 '^ /usr/include' dummy.log
结果应为:
/usr/include
验证新的链接器是否在正确的搜索路径内:
-
****$ grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
结果应为:
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
确保正在使用正确的 libc:
-
*$ grep "/lib/libc.so.6 " dummy.log
结果应为:
最后,确保 GCC 正在使用正确的动态链接器:
-
*$ grep found dummy.log
结果应为:
在确定一切正常后,删除测试文件:
-
*$ rm -v dummy.c a.out dummy.log
测试一下在 chroot 环境中,伪终端(PTY)是否正常工作:
-
$ expect -c "spawn ls"
如果看到这样的输出:
Ask your system administrator to create more.
说明chroot环境还没有设置好 PTY,这时运行 Binutils 和 GCC 的测试套件就没有意义了,必须先解决 PTY 设置。(怎样解决我也不知道,google吧!网上有人说解决的话要重新编译宿主系统的内核,不管它也可以,大不了不运行测试套件)
我的正常工作,输出:
binutils-2.17 (15分钟)
-
$ tar xvf $LFS/binutils-2.17.tar.bz2
-
$ mkdir -v binutils-build
-
$ cd binutils-build
-
$ ../binutils-2.17/configure --prefix=/usr \
--enable-shared -
$ make tooldir=/usr
-
$ make check #这里check应该不会报错
-
$ make tooldir=/usr install
-
$ cp -v ../binutils-2.17/include/libiberty.h /usr/include
-
$ cd ..
-
$ rm -rf binutils-2.17 binutils-build
gcc-4.1.2 (30分钟,不含mack check)
-
$ tar xvf $LFS/gcc-4.1.2.tar.bz2
-
$ cd gcc-4.1.2
-
$ sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
-
$ sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
-
$ sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
-
$ sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
-
$ mkdir -v ../gcc-build
-
$ cd ../gcc-build
-
$ ../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++ -
$ make
-
$ make -k check #官方说本节的GCC测试套件很重要,任何情况下都不要省略这一步。但我还是跳过了
-
$ ../gcc-4.1.2/contrib/test_summary
-
$ make install
-
$ ln -sv ../usr/bin/cpp /lib
-
$ ln -sv gcc /usr/bin/cc
-
$ cd ..
-
$ rm -rf gcc-4.1.2 gcc-build
现在,最终工具链已经形成了,我们需要做的就是确保编译、链接按照我们希望的完成。接下来再依次运行一遍上面带*号的命令,以确保所有的工作都正常,其中带2个*号的输出应为:
/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个*号的命令改为
-
$ grep -B3 '^ /usr/include' dummy.log
输出应为:
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
/usr/include
带4个*号的输出应为:
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
其余不变。
(未完待续--装LFS真是旷日持久的事情啊)
- 版权所有,转载请遵循“署名-非商业用途-保持一致”创作共用协议。
