linux - 使 virtualbox 内核模块内置,而不是模块,完成一半

标签 linux kernel compilation virtualbox

我试图制作内置的 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

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

我把所有的模块源复制到drivers文件夹,编辑makefile,放一个obj-y += vbox/,然后编辑vbox模块的所有Makefile,把obj-m改成obj-y到使它们成为内置的,非常肮脏的 hack,但有效。

编辑

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

最佳答案

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

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

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

关于linux - 使 virtualbox 内核模块内置,而不是模块,完成一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018081/

相关文章:

linux - 内核空间中的优先级

安卓错误 : How to prevent overgrown APK file During compile process in eclipse?

java - 使用多个java源文件编译多个jar文件时出错

linux - 如何在 Bash 中逐行打印时对数据进行排序

linux - 解释 rshd.c 中的 doit() 函数是如何工作的

linux - 根据特定条件将 CSV 文件中的多行合并为一行

linux - 内核调用跟踪中的两个地址

c++ - 在 Linux 上的 C++ 中内存分配新(nothrow)失败时该怎么办

c - 从内核获取基地址寄存器的宏是如何工作的

c++ - 操作系统编译时间