Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


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

2015-4-13 10:50    评论: 3 收藏: 1    

(题图来自: techradar.com)

 

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

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

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的测试套件非常关键,任何情况下都请不要跳过。

1-glibccheck

在这份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

发表评论


最新评论

我也要发表评论

tomzrd [Chrome 31.0|Windows 8.1] 2015-9-4 19:07
调整工具链的第三行代码中ld-new文件找不到,不知道咋回事,导致下边的检测步骤根本没有显示
mv -v /tools/bin/{ld-new,ld}
然后我从解压包里,拷贝相对应的文件到/tools/bin/目录下后,问题解决了
[23:27]root@localhost:/mnt/lfs/src/binutils-build/ld#cp -ar ld-new /tools/bin/
回复
linux 2015-7-27 22:45
1
温文尔雅的饭饭 发表于 2015-7-27 21:20 的评论:
这里写错了一个地方。第二行代码中: 执行清,确保这里没有留下旧文件 :
应该是make mrproper
这个系列太监了。。。不用管它了。。无奈之下,我一生气,才发起的 LCTT 翻译 LFS 的项目。
3 回复
温文尔雅的饭饭 2015-7-27 21:20
这里写错了一个地方。第二行代码中: 执行清,确保这里没有留下旧文件 :
应该是make mrproper
1 回复

热点评论

linux 2015-7-27 22:45
这个系列太监了。。。不用管它了。。无奈之下,我一生气,才发起的 LCTT 翻译 LFS 的项目。
3
温文尔雅的饭饭 2015-7-27 21:20
这里写错了一个地方。第二行代码中: 执行清,确保这里没有留下旧文件 :
应该是make mrproper
1
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。