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

    xiaoxiao2024-02-24  161

    重走LFS之路:(八) 基础系统编译-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.xzcd 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.toolmkdir -v ../glibc-buildcd ../glibc-build

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

    ../glibc-2.21/configure \prefix=/usr \disable-profile \enable-kernel=2.6.32 \enable-obsolete-rpc

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

    makemake 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.confmkdir -pv /var/cache/nscd

    然后进行地方设置和安装

    mkdir -pv /usr/lib/localelocaledef -i cs_CZ -f UTF-8 cs_CZ.UTF-8localedef -i de_DE -f ISO-8859-1 de_DElocaledef -i de_DE@euro -f ISO-8859-15 de_DE@eurolocaledef -i de_DE -f UTF-8 de_DE.UTF-8localedef -i en_GB -f UTF-8 en_GB.UTF-8localedef -i en_HK -f ISO-8859-1 en_HKlocaledef -i en_PH -f ISO-8859-1 en_PHlocaledef -i en_US -f ISO-8859-1 en_USlocaledef -i en_US -f UTF-8 en_US.UTF-8localedef -i es_MX -f ISO-8859-1 es_MXlocaledef -i fa_IR -f UTF-8 fa_IRlocaledef -i fr_FR -f ISO-8859-1 fr_FRlocaledef -i fr_FR@euro -f ISO-8859-15 fr_FR@eurolocaledef -i fr_FR -f UTF-8 fr_FR.UTF-8localedef -i it_IT -f ISO-8859-1 it_ITlocaledef -i it_IT -f UTF-8 it_IT.UTF-8localedef -i ja_JP -f EUC-JP ja_JPlocaledef -i ru_RU -f KOI8-R ru_RU.KOI8-Rlocaledef -i ru_RU -f UTF-8 ru_RU.UTF-8localedef -i tr_TR -f UTF-8 tr_TR.UTF-8localedef -i zh_CN -f GB18030 zh_CN.GB18030make localedata/install-locales

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

    cat > /etc/nsswitch.conf << EOF# Begin /etc/nsswitch.confpasswd: filesgroup: filesshadow: fileshosts: files dnsnetworks: filesprotocols: filesservices: filesethers: filesrpc: files# End /etc/nsswitch.confEOF

    安装时区数据

    tar xf ../tzdata2015a.tar.gzZONEINFO=/usr/share/zoneinfomkdir -pv $ZONEINFO/{posix,right}for tz in etcetera southamerica northamerica europe africa antarctica \asia australasia backward pacificnew systemv; dozic -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}donecp -v zone.tab zone1970.tab iso3166.tab $ZONEINFOzic -d $ZONEINFO -p America/New_Yorkunset 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/libEOFcat >> /etc/ld.so.conf << EOF# Add an include directoryinclude /etc/ld.so.conf.d/*.confEOFmkdir -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/ldgcc -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.ccc dummy.c -v -Wl,–verbose &> dummy.logreadelf -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 /srctar xf zlib-1.2.8.tar.xzcd zlib-1.2.8./configure prefix=/usrmakemake checkmake install

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

    mv -v /usr/lib/libz.so.* /libln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

    File-5.22

    cd /src/file-5.22

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

    make clean

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

    ./configure –prefix=/usrmakemake checkmake install

    Binutils-2.25

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

    expect -c spawn ls

    回显应为

    spawn ls

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

    mv ../binutils-build ../binutils-build.toolmkdir -v ../binutils-buildcd ../binutils-build

    配置编译选项

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

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

    make tooldir=/usrmake -k check

    最后安装

    make tooldir=/usr install 原文发布时间:2015-04-13 本文来自云栖合作伙伴“linux中国” 相关资源:敏捷开发V1.0.pptx
    最新回复(0)