Module 具有多个源文件的内核模块中缺少组件

Module 具有多个源文件的内核模块中缺少组件,module,linker,linux-kernel,Module,Linker,Linux Kernel,我有一个小模块,只有一个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

我有一个小模块,只有一个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");
现在源代码已经增长,我想添加第二个源文件
bar.c

#include <linux/init.h>
#include <linux/module.h>
int aux(int x) {
        return x + 1;
}
但是现在,当我构建模块时,
foo.o
似乎没有链接(
modinfo
报告没有模块许可证和作者,
nm foo.ko
没有找到
foo.c
中定义的符号,
foo\u init
在加载模块时显然没有运行)。将
foo objs:=foo.o bar.o
放入makefile中没有帮助

为什么添加第二个源文件会替换第一个源文件,如何返回
foo


如果这很重要:内核版本是2.6.35,体系结构是arm,模块在树中。

为了让您的东西能够编译,我建议将
foo.c
重命名为例如
foo base.c
(想法是不要有一个与模块同名的
.c
文件。
foo objs
将从您指定的其他对象而不是从
foo.c
构建
foo.o

然后你可以做:

foo-objs := foo-base.o bar.o
obj-m += foo.o
foo-y:=…
也可以,但是我所看到的makefile使用的是
-objs
版本。)
它应该起作用:

$ modprobe foo
$ dmesg|tail
...
[ 8375.303738] foo_init says hello (100)
$ modinfo foo
filename:       /lib/modules/3.0.3-gentoo/kernel/drivers/usb/test/foo.ko
author:         ACME
license:        GPL
depends:        
vermagic:       3.0.3-gentoo SMP mod_unload 
[也就是说,在为示例中的
printk
提供了足够的参数之后:-)]


注意:在更改后重建模块之前,不要忘了清理所有生成的文件。

缩小到一个小例子,解决这个问题的90%。它让我看到,在makefile中使用
foo objs:=foo.o bar.o
时,
make
抱怨:

make[1]: Circular z/foo.o <- z/foo.o dependency dropped.
引擎盖下发生的事情是
$(模块名称).o
$(模块名称).ko构建链的一部分。每个源文件
%.c
被编译成
%.o
。如果有一个源文件与模块具有相同的基本名称,则相同的文件名有两个用途,并会导致严重破坏。在有单个源文件的特殊情况下,
$(module\u name).o
应该与
$(source\u file).o
相同,因此生成链是正确的

如果模块有多个源文件,则模块名称必须与任何源文件的名称不同


我把
foo.c
改名为
foo\u main.c
,一切都很好。

谢谢,我终于找到了答案(我写了一个答案,解释了怎么做——写一个小例子问这个问题是解决问题的90%)。问题确实是有一个与模块同名的源文件。
$ modprobe foo
$ dmesg|tail
...
[ 8375.303738] foo_init says hello (100)
$ modinfo foo
filename:       /lib/modules/3.0.3-gentoo/kernel/drivers/usb/test/foo.ko
author:         ACME
license:        GPL
depends:        
vermagic:       3.0.3-gentoo SMP mod_unload 
make[1]: Circular z/foo.o <- z/foo.o dependency dropped.
ld -EL    -r -o z/foo.o z/bar.o