【GRUB】增加自定义命令

水深无声 2024-02-19 16:15 133阅读 0赞

代码上的直观理解

首先GRUB2的源代码来自grub-2.02: GRUB2源代码,来自ftp://ftp.gnu.org/gnu/grub/,版本是grub-2.02.tar.gz。。

关于如何编译和使用可以参考GRUB2编译与使用 。

于是我们就能够进入到GRUB界面了:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW5nd2VpMDUxMg_size_16_color_FFFFFF_t_70

从上图还可以看到使用了hello这条命令。

查看代码,发现确实是有一个hello.c的文件,其实现如下:

  1. GRUB_MOD_LICENSE ("GPLv3+");
  2. static grub_err_t
  3. grub_cmd_hello (grub_extcmd_context_t ctxt __attribute__ ((unused)),
  4. int argc __attribute__ ((unused)),
  5. char **args __attribute__ ((unused)))
  6. {
  7. grub_printf ("%s\n", _("Hello World"));
  8. return 0;
  9. }
  10. static grub_extcmd_t cmd;
  11. GRUB_MOD_INIT(hello)
  12. {
  13. cmd = grub_register_extcmd ("hello", grub_cmd_hello, 0, 0,
  14. N_("Say `Hello World'."), 0);
  15. }
  16. GRUB_MOD_FINI(hello)
  17. {
  18. grub_unregister_extcmd (cmd);
  19. }

从上述的代码,很容易看出来GRUB下的命令是如何实现的,即使用grub_register_extcmd()来注册其实现。

基本上关于命令的实现就这么简单。

然而……

问题出现

为了进一步验证hello命令就是上述的代码引入的,这里修改了打印信息:

  1. static grub_err_t
  2. grub_cmd_hello (grub_extcmd_context_t ctxt __attribute__ ((unused)),
  3. int argc __attribute__ ((unused)),
  4. char **args __attribute__ ((unused)))
  5. {
  6. grub_printf ("%s\n", _("Goodbye World"));
  7. return 0;
  8. }

修改完之后重新编译,可以看到编译的打印中hello.c确实是被重新编译了。

但是却发现结果还是打印Hello World,而不是这里修改的Goodbye World。

比较两次生成的二进制:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYW5nd2VpMDUxMg_size_16_color_FFFFFF_t_70 1

发现除了一个类似时间戳的东西发生了变化,没有其它的变化,也就是说上述修改的字符串根本就没有生效。

20190128192021160.jpg

由于不是很懂Linux下的编译,所以目前没有看出问题的原因。

需要好好查下……

更新:在【GRUB】GRUB2编译与使用已经说明了原因。

发表评论

表情:
评论列表 (有 0 条评论,133人围观)

还没有评论,来说两句吧...

相关阅读

    相关 osgi定义命令

    有时候我们要查看项目运行情况,比如某个变量的值,这时候就可以把要查看变量的值放在某个方法里,karaf手动执行命令调用方法 先定义类里面要调用的方法 public