gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:29:50 33 4
gpt4 key购买 nike

我有一个带有单个 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;
}

我添加了对 aux 的调用 foo.c中的函数. (好吧,在现实生活中,我在标题中声明了 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。

最佳答案

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

然后你可以这样做:

foo-objs := foo-base.o bar.o
obj-m += foo.o

( foo-y := ... 也可以,但是我看过的 Makefiles 使用的是 -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 提供了足够的参数之后在您的示例中:-)]

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

关于module - 具有多个源文件的内核模块中缺少组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7490070/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com