BusyBox 中添加新命令

向 BusyBox 添加一个新命令非常简单,这是因为它具有良好定义的体系结构。第一个步骤是为新命令的源代码选择一个位置。我们要根据命令的类型(网络,shell 等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在 menuconfig 的配置菜单中出现(在下面的例子中,是 Miscellaneous Utilities 菜单)。
对于这个例子来说,我将这个新命令称为 newcmd,并将它放到了 ./miscutils 目录中。这个新命令的源代码如清单 13 所示。


清单 13. 集成到 BusyBox 中的新命令的源代码


#include "busybox.h"


int newcmd_main( int argc, char *argv[] )
{
  int i;


  printf("newcmd called:\n");


  for (i = 0 ; i < argc ; i++) {


    printf("arg[%d] = %s\n", i, argv[i]);


  }


  return 0;
}


接下来,我们要将这个新命令的源代码添加到所选子目录中的 Makefile.in 中。在本例中,我更新了 ./miscutils/Makefile.in 文件。请按照字母顺序来添加新命令,以便维持与现有命令的一致性:


清单 14. 将命令添加到 Makefile.in 中


MISCUTILS-$(CONFIG_MT)          += mt.o
MISCUTILS-$(CONFIG_NEWCMD)   += newcmd.o
MISCUTILS-$(CONFIG_RUNLEVEL)    += runlevel.o


接下来再次更新 ./miscutils 目录中的配置文件,以便让新命令在配置过程中是可见的。这个文件名为 Config.in,新命令是按照字母顺序添加的:


清单 15. 将命令添加到 Config.in 中


config CONFIG_NEWCMD
    bool "newcmd"
    default n
    help
      newcmd is a new test command.


这个结构定义了一个新配置项(通过 config 关键字)以及一个配置选项(CONFIG_NEWCMD)。新命令可以启用,也可以禁用,因此我们对配置的菜单属性使用了 bool (Boolean)值。这个命令默认是禁用的(n 表示 No),我们可以最后放上一个简短的 Help 描述。在源代码树的 ./scripts/config/Kconfig-language.txt 文件中,我们可以看到配置语法的完整文法。
接下来需要更新 ./include/applets.h 文件,使其包含这个新命令。将下面这行内容添加到这个文件中,记住要按照字母顺序。维护这个次序非常重要,否则我们的命令就会找不到。


清单 16. 将命令添加到 applets.h 中


USE_NEWCMD(APPLET(newcmd, newcmd_main, _BB_DIR_USER_BIN, _BB_SUID_NEVER))


这定义了命令名(newcmd),它在 Busybox 源代码中的函数名(newcmd_main),应该在哪里会为这个新命令创建链接(在这种情况中,它在 /usr/bin 目录中),最后这个命令是否有权设置用户 id(在本例中是 no)。
倒数第二个步骤是向 ./include/usage.h 文件中添加详细的帮助信息。正如您可以从这个文件的例子中看到的一样,使用信息可能非常详细。在本例中,我只添加了一点信息,这样就可以编译这个新命令了:


清单 17. 向 usage.h 添加帮助信息


#define newcmd_trivial_usage    "None"
#define newcmd_full_usage    "None"


最后一个步骤是启用新命令(通过 make menuconfig,然后在 Miscellaneous Utilities 菜单中启用这个选项)然后使用 make 来编译 BusyBox。
使用新的 BusyBox,我们可以对这个新命令进行测试,如清单 18 所示。


清单 18. 测试新命令


$ ./busybox newcmd arg1
newcmd called:
arg[0] = newcmd
arg[1] = arg1
$ ./busybox newcmd --help
BusyBox v1.1.1 (2006.04.12-13:47+0000) multi-call binary


Usage: newcmd None


None


就是这样!BusyBox 开发人员开发了一个优秀但非常容易扩展的工具。




当编译代码为C++的时候
1、可以在外部先把 主函数所在的文件编译成.o 问题。(修改主函数)
2、把本主函数所以赖的问题,便以为.a的库



将可执行程序添加到busybox的步骤:
1、修改可执行程序main函数名:


(1)  如果main函数所在的文件是C++ ,请在main函数前添加extern "C" ,并按照  如下格式修改main函数名:mine_[命令/执行程序名]_main(int argc, char *argv[])  
 
例如:extern "C" int mine_test_main(int argc, char *argv[])
                   
(2)   如果main函数所在的文件是C ,按照如下格式修改main函数名:mine_[命令/执行程序名]_main(int argc, char *argv[])   


例如:int mine_test_main(int argc, char *argv[]) 
  
 2、修改Makefile将该模块编译为静态库命名为:lib[命令/执行程序名].a 
 
 附注:
      1、如果该模块依赖其他静态库,请一并提供。
      
      2、请各模块命令的输出打印包涵各自模块信息。
      
      3、请在命令执行的时候打印版本信息以及编译时间等,以便于定位。
         
  4、请保证大家所使用统一编译器







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值