BusyBox 是标准 Linux 工具的一个单个可执行实现。BusyBox包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军;简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。
命令执行中的函数调用梳理
BusyBox中实际执行的各个命令都是link到/bin/busybox,其关键代码就是libbb/appletlib.c
在这能够看到主函数main,然后就是根据命令匹配对应需要执行的函数了。
该main函数是BusyBox的main函数。argv[0]是applet_name,即实际的命令名称。比如「/bin/ls」的情况下,applet_name就是「/bin/ls」。用bb_basename函数去除applet_name中的目录名,得到命令名。「/bin/ls」的情况下,就是「ls」。通过run_applet_and_exit调用对应的Applet。实际调用的是<Applet名>_main这样的一个函数。比如applet_name是「ls」的情况下,调用的函数就是ls_main。
如果在源代码文件「coreutils/ls.c」下,我们就可以找到以下的函数定
上面简单的介绍了bosybox命令的调用流程,那么要添加命令还要增加命令对应的函数集,增加了函数集,还要增加函数集的编译链接及所需的依赖关系。
下面是扩充命令的步骤:
1,编译菜单中添加命令。
2,制作扩充Applet命令的原型。
3,修改Makefile增加函数集依赖关系
4,移植命令函数集
5,调试扩充Applet命令。
那么下面以增加tcpdump为例,一一对步骤进行实例讲解。
1,编译菜单中添加
在bosybox目录下增加二级目录tcpdump,
然后增加Config.src