1. 简介
BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。
简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令。除此之外,提供了良好的编程框架,用户能够将自己的命令集成到busybox当中。在实际的使用过程中,busybox常常被用于制作linux的根文件系统。
2. 静态编译
下载busybox源码,进行配置编译
curl http://busybox.net/downloads/busybox-1.23.2.tar.bz2 | tar xjf -
mkdir -p obj/busybox
cd busybox-1.23.2
make O=../obj/busybox defconfig #独立在新文件中进行相关配置
cd ../obj/busybox
make menuconfig
修改配置,使用静态编译,如果不使用静态编译,程序运行期间需要进行动态加载,则需在根文件系统中提供其所需的共享库。
Location:
-> Busybox Settings
-> Build Options
[*] Build BusyBox as a static binary (no shared libs)
使用make
进行编译,对于一些机器,可能会报如下的错误:
networking/lib.a(inetd.o): In function `unregister_rpc':
inetd.c:(.text.unregister_rpc+0x17): undefined reference to `pmap_unset'
networking/lib.a(inetd.o): In function `register_rpc':
inetd.c:(.text.register_rpc+0x56): undefined reference to `pmap_unset'
inetd.c:(.text.register_rpc+0x72): undefined reference to `pmap_set'
networking/lib.a(inetd.o): In function `prepare_socket_fd':
inetd.c:(.text.prepare_socket_fd+0x7f): undefined reference to `bindresvport'
collect2: ld returned 1 exit status
make[2]: *** [busybox_unstripped] Error 1
make[1]: *** [_all] Error 2
make: *** [all] Error 2
观察上面的错误,可以发现问题出在inetd.c
中有未定义的引用,在网上搜索一下答案,关闭配置当中的inet
选项即可忽略该问题
Location:
-> Networking Utilities
[ ] inetd
这时再执行make
,就能生成busybox
,执行make install
生成_install
目录,该目录中生成了常用的linux命令,这些命令均是符号链接到busybox上的。
3. 动态编译
网上大部分人都讲述的如何静态编译,而少部分人的讲述并未考虑到不同平台带来的问题,而我使用的平台为x86_64架构上,作为第一次探索动态编译,在这个过程当中遇到不少困难,希望下面的过程,能够对你有用。
接下来,我们会使用到以下几个命令:
- readel