重走LFS之路:(八) 基础系统编译-1

重走LFS之路:(八) 基础系统编译-1

(题图来自: techradar.com)

 

从现在开始,我们进入真正意义上的LFS系统的基础系统编译。

这个阶段比较漫长,中间还有可能出现各种各样的问题,我会尽量翔实地记录遇到的各种状况和解决方案,以供后来参考。

Linux-3.19 API Headers

 
  
  1. cd /src/linux-3.19

执行编译清理

 
  
  1. cd /src/linux-3.19

重新编译

 
  
  1. make INSTALL_HDR_PATH=dest headers_install

删除非必要文件

 
  
  1. find dest/include \( -name .install -o -name ..install.cmd \) -delete

手工安装

 
  
  1. cp -rv dest/include/* /usr/include

Man-pages-3.79

 
  
  1. cd /src

解压并进入源码目录

 
  
  1. tar xf man-pages-3.79.tar.xz
  2. cd man-pages-3.79

安装

 
  
  1. make install

Glibc-2.21

 
  
  1. cd /src/glibc-2.21

此时需要给glibc打个补丁

 
  
  1. patch -Np1 -i ../glibc-2.21-fhs-1.patch

然后解决32位的兼容问题

 
  
  1. sed -e ‘/ia32/s/^/1:/ \
  2. -e ‘/SSE2/s/^1://’ \
  3. -i sysdeps/i386/i686/multiarch/mempcpy_chk.S

由于之前编译过glibc,存在glibc-build目录,所以需要重命名一下老的构建目录并重建一个空的构建目录进入

 
  
  1. mv ../glibc-build ../glibc-build.tool
  2. mkdir -v ../glibc-build
  3. cd ../glibc-build

配置编译选项,其中开启了2.6内核支持

 
  
  1. ../glibc-2.21/configure \
  2. prefix=/usr \
  3. disable-profile \
  4. enable-kernel=2.6.32 \
  5. enable-obsolete-rpc

配置完成后进行编译和编译测试

 
  
  1. make
  2. make check

在这里,LFS 7.7官方文档给出了一个警告

在这一节中,glibc的测试套件非常关键,任何情况下都请不要跳过。

1-glibccheck

1-glibccheck

在这份summary中,有2个错误,但是没关系,不用害怕,可以继续往下。

建立一个配置文件

 
  
  1. touch /etc/ld.so.conf

正常安装

 
  
  1. make install

在这里需要说的是,虽然官方文档说测试套件很重要,但是就实际经验来看,只要能够正常make过去,通常不会出现什么大问题,所以只要不是很严重的错误,check不过也可以先让它过去,真正出问题时候再说。

为nscd建立配置文件和运行时目录

 
  
  1. cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf
  2. mkdir -pv /var/cache/nscd

然后进行地方设置和安装

 
  
  1. mkdir -pv /usr/lib/locale
  2. localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
  3. localedef -i de_DE -f ISO-8859-1 de_DE
  4. localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
  5. localedef -i de_DE -f UTF-8 de_DE.UTF-8
  6. localedef -i en_GB -f UTF-8 en_GB.UTF-8
  7. localedef -i en_HK -f ISO-8859-1 en_HK
  8. localedef -i en_PH -f ISO-8859-1 en_PH
  9. localedef -i en_US -f ISO-8859-1 en_US
  10. localedef -i en_US -f UTF-8 en_US.UTF-8
  11. localedef -i es_MX -f ISO-8859-1 es_MX
  12. localedef -i fa_IR -f UTF-8 fa_IR
  13. localedef -i fr_FR -f ISO-8859-1 fr_FR
  14. localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
  15. localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
  16. localedef -i it_IT -f ISO-8859-1 it_IT
  17. localedef -i it_IT -f UTF-8 it_IT.UTF-8
  18. localedef -i ja_JP -f EUC-JP ja_JP
  19. localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
  20. localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
  21. localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
  22. localedef -i zh_CN -f GB18030 zh_CN.GB18030
  23. make localedata/install-locales

继续配置glibc,写入nsswitch.conf文件

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

安装时区数据

 
  
  1. tar xf ../tzdata2015a.tar.gz
  2. ZONEINFO=/usr/share/zoneinfo
  3. mkdir -pv $ZONEINFO/{posix,right}
  4. for tz in etcetera southamerica northamerica europe africa antarctica \
  5. asia australasia backward pacificnew systemv; do
  6. zic -L /dev/null -d $ZONEINFO -y sh yearistype.sh ${tz}
  7. zic -L /dev/null -d $ZONEINFO/posix -y sh yearistype.sh ${tz}
  8. zic -L leapseconds -d $ZONEINFO/right -y sh yearistype.sh ${tz}
  9. done
  10. cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
  11. zic -d $ZONEINFO -p America/New_York
  12. unset ZONEINFO

其中America/New_York可以改成其他地区,官方文档上是按纽约时间走的。不过没关系,时区和语言设置可以在系统运行之后再调整。

现在也可以调整,使用tzselect

 
  
  1. tzselect

然后按照提示选择:大洲->国家->时区->确认

或者直接将地区文件复制替换/etc/localtime,比如将时间调整为上海时间

 
  
  1. cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置动态加载

 
  
  1. cat > /etc/ld.so.conf << EOF
  2. # Begin /etc/ld.so.conf
  3. /usr/local/lib
  4. /opt/lib
  5. EOF
  6. cat >> /etc/ld.so.conf << EOF
  7. # Add an include directory
  8. include /etc/ld.so.conf.d/*.conf
  9. EOF
  10. mkdir -pv /etc/ld.so.conf.d

调整工具链

接下来的编译与上面不同,需要对工具链来进行一些调整

 
  
  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
  5. gcc -dumpspecs | sed -e s@/tools@@g \
  6. -e ‘/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}’ \
  7. -e ‘/\*cpp:/{n;s@$@ -isystem /usr/include@}’ > \
  8. `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

如果正确,应有如下回显

 
  
  1. [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

查看成功日志

 
  
  1. grep -o ‘/usr/lib.*/crt[1in].*succeeded dummy.log

应有如下回显

 
  
  1. /usr/lib/../lib64/crt1.o succeeded
  2. /usr/lib/../lib64/crti.o succeeded
  3. /usr/lib/../lib64/crtn.o succeeded

查看头文件包含日志

 
  
  1. grep -B1 ‘^ /usr/include dummy.log

应有如下回显

 
  
  1. #include <…> search starts here:
  2. /usr/include

查看lib日志

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

应有如下回显,比官方文档多第一条和最后一条

 
  
  1. SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib64″)
  2. SEARCH_DIR(“/usr/lib”)
  3. SEARCH_DIR(“/lib”)
  4. SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib”);

查看libc日志

 
  
  1. grep “/lib.*/libc.so.6 dummy.log

应有如下回显

 
  
  1. attempt to open /lib64/libc.so.6 succeeded

最后查看动态连接日志

 
  
  1. grep found dummy.log

应有如下回显

 
  
  1. found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2

清理测试文件

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

Zlib-1.2.8

 
  
  1. cd /src
  2. tar xf zlib-1.2.8.tar.xz
  3. cd zlib-1.2.8
  4. ./configure prefix=/usr
  5. make
  6. make check
  7. make install

此时需要移动一些模块文件,建立一些符号链接

 
  
  1. mv -v /usr/lib/libz.so.* /lib
  2. ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

File-5.22

 
  
  1. cd /src/file-5.22

由于以前编译过,所以需要先清理一下

 
  
  1. make clean

然后可以进行正常配置和安装

 
  
  1. ./configure –prefix=/usr
  2. make
  3. make check
  4. make install

Binutils-2.25

由于chroot进来,需要先进行一个环境测试

 
  
  1. expect -c spawn ls

回显应为

 
  
  1. spawn ls

由于之前编译过binutils,所以需要重命名构建目录,再新建一个空的构建目录并进入

 
  
  1. mv ../binutils-build ../binutils-build.tool
  2. mkdir -v ../binutils-build
  3. cd ../binutils-build

配置编译选项

 
  
  1. ../binutils-2.25/configure prefix=/usr \
  2. enable-shared \
  3. disable-werror

编译时需要加一个tooldir的参数,之后编译测试

 
  
  1. make tooldir=/usr
  2. make -k check

最后安装

 
  
  1. make tooldir=/usr install

原文发布时间:2015-04-13

本文来自云栖合作伙伴“linux中国”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值