天天看点

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

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

(题图来自: techradar.com)

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

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

<a target="_blank"></a>

<code>cd /src/linux-3.19</code>

执行编译清理

重新编译

<code>make install_hdr_path=dest headers_install</code>

删除非必要文件

<code>find dest/include \( -name .install -o -name ..install.cmd \) -delete</code>

手工安装

<code>cp -rv dest/include/* /usr/include</code>

<code>cd /src</code>

解压并进入源码目录

<code>tar xf man-pages-3.79.tar.xz</code>

<code></code>

<code>cd man-pages-3.79</code>

安装

<code>make install</code>

<code>cd /src/glibc-2.21</code>

此时需要给glibc打个补丁

<code>patch -np1 -i ../glibc-2.21-fhs-1.patch</code>

然后解决32位的兼容问题

<code>sed -e ‘/ia32/s/^/1:/’ \</code>

<code>-e ‘/sse2/s/^1://’ \</code>

<code>-i sysdeps/i386/i686/multiarch/mempcpy_chk.s</code>

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

<code>mv ../glibc-build ../glibc-build.tool</code>

<code>mkdir -v ../glibc-build</code>

<code>cd ../glibc-build</code>

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

<code>../glibc-2.21/configure \</code>

<code>–prefix=/usr \</code>

<code>–disable-profile \</code>

<code>–enable-kernel=2.6.32 \</code>

<code>–enable-obsolete-rpc</code>

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

<code>make</code>

<code>make check</code>

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

在这一节中,glibc的测试套件非常关键,任何情况下都请不要跳过。
重走LFS之路:(八) 基础系统编译-1重走LFS之路:(八) 基础系统编译-1

1-glibccheck

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

建立一个配置文件

<code>touch /etc/ld.so.conf</code>

正常安装

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

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

<code>cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf</code>

<code>mkdir -pv /var/cache/nscd</code>

然后进行地方设置和安装

<code>mkdir -pv /usr/lib/locale</code>

<code>localedef -i cs_cz -f utf-8 cs_cz.utf-8</code>

<code>localedef -i de_de -f iso-8859-1 de_de</code>

<code>localedef -i de_de@euro -f iso-8859-15 de_de@euro</code>

<code>localedef -i de_de -f utf-8 de_de.utf-8</code>

<code>localedef -i en_gb -f utf-8 en_gb.utf-8</code>

<code>localedef -i en_hk -f iso-8859-1 en_hk</code>

<code>localedef -i en_ph -f iso-8859-1 en_ph</code>

<code>localedef -i en_us -f iso-8859-1 en_us</code>

<code>localedef -i en_us -f utf-8 en_us.utf-8</code>

<code>localedef -i es_mx -f iso-8859-1 es_mx</code>

<code>localedef -i fa_ir -f utf-8 fa_ir</code>

<code>localedef -i fr_fr -f iso-8859-1 fr_fr</code>

<code>localedef -i fr_fr@euro -f iso-8859-15 fr_fr@euro</code>

<code>localedef -i fr_fr -f utf-8 fr_fr.utf-8</code>

<code>localedef -i it_it -f iso-8859-1 it_it</code>

<code>localedef -i it_it -f utf-8 it_it.utf-8</code>

<code>localedef -i ja_jp -f euc-jp ja_jp</code>

<code>localedef -i ru_ru -f koi8-r ru_ru.koi8-r</code>

<code>localedef -i ru_ru -f utf-8 ru_ru.utf-8</code>

<code>localedef -i tr_tr -f utf-8 tr_tr.utf-8</code>

<code>localedef -i zh_cn -f gb18030 zh_cn.gb18030</code>

<code>make localedata/install-locales</code>

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

<code>cat &gt; /etc/nsswitch.conf &lt;&lt; “eof”</code>

<code># begin /etc/nsswitch.conf</code>

<code>passwd: files</code>

<code>group: files</code>

<code>shadow: files</code>

<code>hosts: files dns</code>

<code>networks: files</code>

<code>protocols: files</code>

<code>services: files</code>

<code>ethers: files</code>

<code>rpc: files</code>

<code># end /etc/nsswitch.conf</code>

<code>eof</code>

安装时区数据

<code>tar xf ../tzdata2015a.tar.gz</code>

<code>zoneinfo=/usr/share/zoneinfo</code>

<code>mkdir -pv $zoneinfo/{posix,right}</code>

<code>for tz in etcetera southamerica northamerica europe africa antarctica \</code>

<code>asia australasia backward pacificnew systemv; do</code>

<code>zic -l /dev/null -d $zoneinfo -y “sh yearistype.sh” ${tz}</code>

<code>zic -l /dev/null -d $zoneinfo/posix -y “sh yearistype.sh” ${tz}</code>

<code>zic -l leapseconds -d $zoneinfo/right -y “sh yearistype.sh” ${tz}</code>

<code>done</code>

<code>cp -v zone.tab zone1970.tab iso3166.tab $zoneinfo</code>

<code>zic -d $zoneinfo -p america/new_york</code>

<code>unset zoneinfo</code>

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

现在也可以调整,使用tzselect

<code>tzselect</code>

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

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

<code>cp -v /usr/share/zoneinfo/asia/shanghai /etc/localtime</code>

配置动态加载

<code>cat &gt; /etc/ld.so.conf &lt;&lt; “eof”</code>

<code># begin /etc/ld.so.conf</code>

<code>/usr/local/lib</code>

<code>/opt/lib</code>

<code>cat &gt;&gt; /etc/ld.so.conf &lt;&lt; “eof”</code>

<code># add an include directory</code>

<code>include /etc/ld.so.conf.d/*.conf</code>

<code>mkdir -pv /etc/ld.so.conf.d</code>

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

<code>mv -v /tools/bin/{ld,ld-old}</code>

<code>mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}</code>

<code>mv -v /tools/bin/{ld-new,ld}</code>

<code>ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld</code>

<code>gcc -dumpspecs | sed -e ‘s@/tools@@g’ \</code>

<code>-e ‘/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}’ \</code>

<code>-e ‘/\*cpp:/{n;s@$@ -isystem /usr/include@}’ &gt; \</code>

<code>`dirname $(gcc –print-libgcc-file-name)`/specs</code>

测试调整后的工具链

<code>echo ‘main(){}’ &gt; dummy.c</code>

<code>cc dummy.c -v -wl,–verbose &amp;&gt; dummy.log</code>

<code>readelf -l a.out | grep ‘: /lib’</code>

如果正确,应有如下回显

<code>[requesting program interpreter: /lib64/ld-linux-x86-64.so.2]</code>

查看成功日志

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

应有如下回显

<code>/usr/lib/../lib64/crt1.o succeeded</code>

<code>/usr/lib/../lib64/crti.o succeeded</code>

<code>/usr/lib/../lib64/crtn.o succeeded</code>

查看头文件包含日志

<code>grep -b1 ‘^ /usr/include’ dummy.log</code>

<code>#include &lt;…&gt; search starts here:</code>

<code>/usr/include</code>

查看lib日志

<code>grep ‘search.*/usr/lib’ dummy.log |sed ‘s|; |\n|g’</code>

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

<code>search_dir(“=/tools/x86_64-unknown-linux-gnu/lib64″)</code>

<code>search_dir(“/usr/lib”)</code>

<code>search_dir(“/lib”)</code>

<code>search_dir(“=/tools/x86_64-unknown-linux-gnu/lib”);</code>

查看libc日志

<code>grep “/lib.*/libc.so.6 ” dummy.log</code>

<code>attempt to open /lib64/libc.so.6 succeeded</code>

最后查看动态连接日志

<code>grep found dummy.log</code>

<code>found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2</code>

清理测试文件

<code>rm -v dummy.c a.out dummy.log</code>

<code>tar xf zlib-1.2.8.tar.xz</code>

<code>cd zlib-1.2.8</code>

<code>./configure –prefix=/usr</code>

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

<code>mv -v /usr/lib/libz.so.* /lib</code>

<code>ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so</code>

<code>cd /src/file-5.22</code>

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

<code>make clean</code>

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

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

<code>expect -c “spawn ls”</code>

回显应为

<code>spawn ls</code>

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

<code>mv ../binutils-build ../binutils-build.tool</code>

<code>mkdir -v ../binutils-build</code>

<code>cd ../binutils-build</code>

配置编译选项

<code>../binutils-2.25/configure –prefix=/usr \</code>

<code>–enable-shared \</code>

<code>–disable-werror</code>

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

<code>make tooldir=/usr</code>

<code>make -k check</code>

最后安装

<code>make tooldir=/usr install</code>

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

本文来自云栖合作伙伴“linux中国”

继续阅读