我有一个带有单个C源文件foo.c
的小模块,一切都很好。内核模块中缺少具有多个源文件的组件
#include <linux/init.h>
#include <linux/module.h>
static int __init foo_init(void) {
printk(KERN_INFO "foo_init says hello (%d)\n");
return 0;
}
static void __exit foo_exit(void) {
}
module_init(foo_init);
module_exit(foo_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ACME");
的Makefile
很简单:
obj-m += foo.o
既然源不断壮大,我想添加第二个源文件bar.c
:
#include <linux/init.h>
#include <linux/module.h>
int aux(int x) {
return x + 1;
}
我已经加入到呼叫在foo.c
中的aux
函数。 (好吧,在现实生活中,我在头文件中声明了aux
函数,而我的代码不仅仅是打印一条消息,而且我将这个问题缩小到这个小例子。)并且我添加了一行来声明组件makefile中的模块,位于Documentation/kbuild/makefiles.txt
之后。
foo-objs += bar.o
obj-m += foo.o
但是现在,当我构建模块,似乎foo.o
不挂(modinfo
没有报告任何模块的许可和作者,nm foo.ko
没有找到foo.c
定义的符号,foo_init
明显未当我运行加载模块)。将foo-objs := foo.o bar.o
放在makefile中不起作用。
为什么添加第二个源文件会取代第一个源文件,并且如何返回foo
?
万一这一点很重要:内核版本是2.6.35,架构是arm,模块是in-tree。
谢谢,我最终发现它(我写了一个答案解释了如何 - 写一个小例子来问这个问题是解决问题的90%)。这个问题确实有一个与模块名称相同的源文件。 – Gilles