Module 具有多个源文件的内核模块中缺少组件
我有一个小模块,只有一个C源文件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
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