Linux:重走LFS之路:(八) 基础系统编译-1
June 1, 2015
(题图来自: techradar.com)
从现在开始,我们进入真正意义上的LFS系统的基础系统编译。
这个阶段比较漫长,中间还有可能出现各种各样的问题,我会尽量翔实地记录遇到的各种状况和解决方案,以供后来参考。
Table of Contents
Linux-3.19 API Headers
cd /src/linux-3.19
执行编译清理
cd /src/linux-3.19
重新编译
make INSTALL_HDR_PATH=dest headers_install
删除非必要文件
find dest/include ( -name .install -o -name ..install.cmd ) -delete
手工安装
cp -rv dest/include/* /usr/include
Man-pages-3.79
cd /src
解压并进入源码目录
tar xf man-pages-3.79.tar.xz cd man-pages-3.79
安装
make install
Glibc-2.21
cd /src/glibc-2.21
此时需要给glibc打个补丁
patch -Np1 -i ../glibc-2.21-fhs-1.patch
然后解决32位的兼容问题
sed -e ‘/ia32/s/^/1:/’ -e ‘/SSE2/s/^1://’ -i sysdeps/i386/i686/multiarch/mempcpy_chk.S
由于之前编译过glibc,存在glibc-build目录,所以需要重命名一下老的构建目录并重建一个空的构建目录进入
mv ../glibc-build ../glibc-build.tool mkdir -v ../glibc-build cd ../glibc-build
配置编译选项,其中开启了2.6内核支持
../glibc-2.21/configure –prefix=/usr –disable-profile –enable-kernel=2.6.32 –enable-obsolete-rpc
配置完成后进行编译和编译测试
make make check
在这里,LFS 7.7官方文档给出了一个警告
在这一节中,glibc的测试套件非常关键,任何情况下都请不要跳过。
在这份summary中,有2个错误,但是没关系,不用害怕,可以继续往下。
建立一个配置文件
touch /etc/ld.so.conf
正常安装
make install
在这里需要说的是,虽然官方文档说测试套件很重要,但是就实际经验来看,只要能够正常make过去,通常不会出现什么大问题,所以只要不是很严重的错误,check不过也可以先让它过去,真正出问题时候再说。
为nscd建立配置文件和运行时目录
cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd
然后进行地方设置和安装
mkdir -pv /usr/lib/locale localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i en_GB -f UTF-8 en_GB.UTF-8 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 it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 make localedata/install-locales
继续配置glibc,写入nsswitch.conf文件
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
安装时区数据
tar xf ../tzdata2015a.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica asia australasia backward pacificnew systemv; do zic -L /dev/null -d $ZONEINFO -y “sh yearistype.sh” ${tz} zic -L /dev/null -d $ZONEINFO/posix -y “sh yearistype.sh” ${tz} zic -L leapseconds -d $ZONEINFO/right -y “sh yearistype.sh” ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO
其中America/New_York可以改成其他地区,官方文档上是按纽约时间走的。不过没关系,时区和语言设置可以在系统运行之后再调整。
现在也可以调整,使用tzselect
tzselect
然后按照提示选择:大洲->国家->时区->确认
或者直接将地区文件复制替换/etc/localtime,比如将时间调整为上海时间
cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
配置动态加载
cat > /etc/ld.so.conf << “EOF” # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF cat >> /etc/ld.so.conf << “EOF” # Add an include directory include /etc/ld.so.conf.d/*.conf EOF mkdir -pv /etc/ld.so.conf.d
调整工具链
接下来的编译与上面不同,需要对工具链来进行一些调整
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 -dumpspecs | sed -e ‘s@/tools@@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’
如果正确,应有如下回显
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
查看成功日志
grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log
应有如下回显
/usr/lib/../lib64/crt1.o succeeded /usr/lib/../lib64/crti.o succeeded /usr/lib/../lib64/crtn.o succeeded
查看头文件包含日志
grep -B1 ‘^ /usr/include’ dummy.log
应有如下回显
#include <…> search starts here: /usr/include
查看lib日志
grep ‘SEARCH.*/usr/lib’ dummy.log |sed ‘s|; |n|g’
应有如下回显,比官方文档多第一条和最后一条
SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib64″) SEARCH_DIR(“/usr/lib”) SEARCH_DIR(“/lib”) SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib”);
查看libc日志
grep “/lib.*/libc.so.6 ” dummy.log
应有如下回显
attempt to open /lib64/libc.so.6 succeeded
最后查看动态连接日志
grep found dummy.log
应有如下回显
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
清理测试文件
rm -v dummy.c a.out dummy.log
Zlib-1.2.8
cd /src tar xf zlib-1.2.8.tar.xz cd zlib-1.2.8 ./configure –prefix=/usr make make check make install
此时需要移动一些模块文件,建立一些符号链接
mv -v /usr/lib/libz.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
File-5.22
cd /src/file-5.22
由于以前编译过,所以需要先清理一下
make clean
然后可以进行正常配置和安装
./configure –prefix=/usr make make check make install
Binutils-2.25
由于chroot进来,需要先进行一个环境测试
expect -c “spawn ls”
回显应为
spawn ls
由于之前编译过binutils,所以需要重命名构建目录,再新建一个空的构建目录并进入
mv ../binutils-build ../binutils-build.tool mkdir -v ../binutils-build cd ../binutils-build
配置编译选项
../binutils-2.25/configure –prefix=/usr –enable-shared –disable-werror
编译时需要加一个tooldir的参数,之后编译测试
make tooldir=/usr make -k check
最后安装
make tooldir=/usr install
0 Comments