读书频道 > 系统 > linux > 深度探索Linux操作系统系统构建和原理解析
3.4.3 安装shell
2013-09-29 08:46:59     我来说两句 
收藏    我要投稿   
全书一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链  立即去当当网订购

在安装C库后,构建基本的应用程序的基础已经具备了,接下来我们需要为内核准备用户空间的程序了。在Linux中,专门负责启动的软件包,如System V init和Systemd等都提供一个二进制程序作为第一个进程执行的用户空间的程序,但是为简单起见,我们使用bash shell。安装bash的命令如下:
vita@baisheng:/vita/build$ tar xvf ../source/bash-4.2.tar.gz
vita@baisheng:/vita/build/bash-4.2$ ./configure --prefix=/usr \
   --bindir=/bin --without-bash-malloc
vita@baisheng:/vita/build/bash-4.2$ make
vita@baisheng:/vita/build/bash-4.2$ make install DESTDIR=$SYSROOT

这里有一点需要解释一下,我们虽然定义了环境变量DESTDIR为$SYSROOT,但是由于bash的Makefile中有如下脚本:
bash-4.2/Makefile:
DESTDIR =

而Makefile中的这个定义优先级要比环境变量的高,所以我们还需要通过命令行参数再次指定安装目录为$SYSROOT。

使用如下命令将bash安装到rootfs中:
vita@baisheng:/vita$ mkdir rootfs/bin
vita@baisheng:/vita$ cp sysroot/bin/bash rootfs/bin/

除了安装程序bash外,当然还需要安装bash依赖的动态库。因此,为了检查可执行程序或动态库的依赖,我们编写了一个脚本ldd:
/vita/cross-tool/bin/ldd:
#!/bin/bash
LIBDIR="${SYSROOT}/lib ${SYSROOT}/usr/lib
          ${CROSS_TOOL}/${TARGET}/lib"
find() {
    for d in $LIBDIR; do
        found=""
        if [ -f "${d}/$1" ]; then
            found="${d}/$1"
            break
        fi
    done

    if [ -n "$found" ]; then
        printf "%8s%s => %s\n" "" $1 $found
    else
        printf "%8s%s => (not found)\n" "" $1
    fi
}
readelf -d $1 | grep NEEDED \
    | sed -r -e 's/.*Shared library:[ ]+\[(.*)\]/\1/;' \
    | while read lib; do
        find $lib
    done

并为该脚本增加了可执行权限:
vita@baisheng:/vita/cross-tool/bin$ chmod a+x ldd

使用ldd脚本查看bash依赖的动态库:
vita@baisheng:/vita$ ldd rootfs/bin/bash
        libdl.so.2 => /vita/sysroot/lib/libdl.so.2
        libgcc_s.so.1 =>
           /vita/cross-tool/i686-none-linux-gnu/lib/libgcc_s.so.1
        libc.so.6 => /vita/sysroot/lib/libc.so.6

根据脚本ldd的输出可见,bash依赖动态库libdl、libc和libgcc_s.so.1,而这几个库都包含在C库中,我们都已经安装了。

在3.3.7节我们看到,如果用户没有通过内核命令行参数“init”指定第一个进程运行的用户空间的程序,则内核依次尝试执行目录/sbin、/etc、/bin下的init,最后尝试执行目录/bin下的sh。因此,我们在目录/bin下建立一个指向bash的符号链接sh,而且,这个符号链接也是FHS标准要求的。
vita@baisheng:/vita/rootfs/bin$ ln -s bash sh

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.4.2 安装C库
下一篇:3.4.4 安装根文件系统到目标系统
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站