1.24.2版本busybox扩充命令及函数集讲解||扩充applet命令

来源:互联网 发布:西安定家小酥肉淘宝店 编辑:程序博客网 时间:2024/06/11 17:57

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


Kbuild.src。


这样在后面的编译前会根据这两个文件产生Config.in及Kbuild供busybox中makefile调用。

 

2,制作Applet的原型。

在include目录下找到applets.src.h。


根据字母顺序对应上下文,增加tcpdump对应的编译导出宏参数。

在include目录下找到applet_tables.h。


根据字母顺序对应上下文,增加tcpdump对应的外部函数调用接口。

 

3,修改Makefile,增加函数集依赖关系


在busybox目录下的主makefile下增加tcpdump/\供主makefile编译中进入tcpdump二级目录。

修改主Config.in文件,增加调用tcpdump/config.src,从而编译中使之能够生成config文件供调用使用。



在scripts目录下的makefile.IMA中增加tcpdump/Kbulid这样在主编译流程调用进入tcpdump目录后,会读取kbuild继续编译。


若扩充的命令需要依赖其他so,那么还修改trylink文件


增加pcap crypto及dl库供tcpdump函数库文件编译链接使用。


4,移植命令函数集

通过apt-get source tcpdump 迁出tcpdump源码。


进入源文件目录执行./configuew生成makefile文件。


这样就得到需要移植的c文件及依赖的库文件(pcap等)。


然后把需要的.c文件copy到tcpdump目录下并将需要的.h文件同步copy过去。

修改kbuild.in文件。增加新增的.C编译操作。


同步增加tcpdump_main.c


注意增加的usage中的两个define,这个会在实际编译中会自动增加到include中的applet.h中,供busybox提示命令使用。

然后是修改tcpdump.c文件


修改为


这样就完成了busybox到tcpdump命令执行中的函数调度连接工作。

5,调试Applet扩充命令

首选执行make menucnfig。


选择tcpdump proc



Select之后,选择exit。

在save new configuration中选择Yes。然后会退出配置窗口。



最后执行make,重新编译busybox。


静态编译成功后,在busybox中执行一下tcpdump命令,哇,可以使用了。

 

总体来说可以分为两大块:

1),修改原busyboy命令节点调用流程增加tcpdump命令及函数调用接口;同步修改makefile,kbuild,config及trylink等编译连接文件支持对新增命令集的追加编译。

2),迁出命令源代码,将源文件移植到命令节点的目录下,在编译中解决头文件引用问题,外部库依赖问题及源函数集中configure生成的config.h存在的一些预定义的编译宏问题。

 

体会就是增加一个applet命令节点比较简单,但是要将命令函数集移植过来,需要解决头文件问题,源config.h中的宏引用问题,参数的宏修饰等问题会比较耗时间。


1 0
原创粉丝点击