【问题标题】:Make virtualbox kernel modules builtin, rather than modules, half done使 virtualbox 内核模块内置,而不是模块,完成了一半
【发布时间】:2012-08-14 15:03:41
【问题描述】:

我试图让 virtualbox 内核模块内置,我几乎在这里完成,但在最后一步,它停止编译,因为内核似乎将所有 vbox* 模块视为一个单一的:

drivers/vboxnetadp/built-in.o: In function `cleanup_module':
(.exit.text+0x0): multiple definition of `cleanup_module'
drivers/vboxdrv/built-in.o:(.exit.text+0x0): first defined here
drivers/vboxnetadp/built-in.o: In function `init_module':
(.init.text+0x0): multiple definition of `init_module'

.. suppressed output ...

make[1]: *** [drivers/built-in.o] Error 1
make: *** [drivers] Error 2

有什么想法吗?我是这样得到的:

我将所有模块源复制到驱动程序文件夹中,编辑makefile,放入obj-y += vbox/,并编辑vbox模块的所有Makefile,将obj-m更改为obj-y以使其成为内置的,非常肮脏的hack,但有效。

编辑

为什么需要这样做?我需要在我的机器上禁用模块加载,所以不应该存在任何模块,我已经将我自己编写的所有模块都内置了,现在只剩下 vbox 的了

【问题讨论】:

  • 你想要完成什么?将驱动程序构建到内核中只是达到目的的一种手段;你真的在做什么?
  • 嗨@MichaelHampton 只想通过使其成为静态的、无模块的方式来保护内核
  • 声明这些函数static有帮助吗?
  • 你真正的问题是什么?您想避免在您的机器上安装编译器吗?如果您必须进行内核更新,您的解决方案有什么帮助?为什么要禁用模块机制?

标签: linux kernel compilation virtualbox


【解决方案1】:

我会说你的问题属于 Stack Overflow,因为它基本上是一个 c 编程语言问题。

您面临的问题是您试图将两个(以前是分开的)程序编译为一个。两者似乎都使用相同的功能 - 意味着在各自的上下文中。

我的猜测是,您必须将所有这些多次出现的 init_module 或其他函数重命名为单独的命名空间(如 net_init_moduledrv_init_module)。或者也许有一种方法可以将这些函数声明为“本地” - 我用 C 编程已经有一段时间了......

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2016-03-25
    • 2018-08-18
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2016-03-18
    • 2012-04-11
    相关资源
    最近更新 更多