【发布时间】:2021-12-31 16:18:57
【问题描述】:
我正在尝试使用多个源文件构建可加载的内核模块。根据https://www.kernel.org/doc/Documentation/kbuild/makefiles.txt 的第 3.3 节,我必须将 obj-m 用于主目标文件,将 modulename-y 用于其余部分。 这是我的mwe:
helpers.h
#ifndef __HELPERS_H__
#define __HELPERS_H__
void helper_print_init(void);
void helper_print_exit(void);
#endif // __HELPERS_H__
helpers.c
#include "helpers.h"
#include <linux/kernel.h>
void helper_print_init(void) {
printk("multi_file_ko_init_helper\n");
}
void helper_print_exit(void) {
printk("multi_file_ko_exit_helper\n");
}
multiFileKo.c
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
//#include "helpers.h"
static int __init multi_file_ko_init(void) {
printk("multi_file_ko_init\n");
// helper_print_init();
return 0;
}
static void __exit multi_file_ko_exit(void) {
printk("multi_file_ko_exit\n");
// helper_print_exit();
}
module_init(multi_file_ko_init);
module_exit(multi_file_ko_exit);
MODULE_LICENSE("MIT");
MODULE_AUTHOR("AUTHOR");
MODULE_DESCRIPTION("gpio");
MODULE_VERSION("0.0");
请注意,multiFileKo.c 目前甚至没有真正使用帮助程序。我尝试实际调用这些函数,但为简单起见,我只是将 mwe 中的内容注释掉。
现在,如果我像下面这样使用 kbuild 编译它,只使用主文件,我会得到预期的 dmesg 输出:
obj-m := multiFileKo.o
但是当我尝试编译它与助手链接时,即使没有像下面这样实际使用它们,dmesg 仍然保持沉默,即使 insmod/rmmod 似乎正在工作:
obj-m := multiFileKo.o
multiFileKo-y := helpers.o
显然,如果我取消注释 multiFileKo.c 中的所有内容,它也不起作用。因此,链接附加目标文件的事实似乎破坏了我的模块,无论附加目标文件做什么。
使用 multiFileKo-objs 的方法对我也不起作用。我之前看到过这个,但可以确定它的来源,因为 makefiles 手册仅在主机程序的上下文中使用它。
【问题讨论】:
-
显示您的整个
Makefile -
您的问题的核心是您的内核模块由多个源文件组成,并且该源文件之一的名称 -
multiFileKo.c- 与模块本身的名称 (multiFileKo) 一致。 -
@MarcoBonelli 这是整个生成文件
-
"为什么当它是单源文件模块时它可以工作,如果它是多源文件则不行?" - 您的 Makefile 没有正确指定多个源文件。在当前形式中,
multiFileKo-y := helpers.o行是无用。被重写为multiFileKo-objs := helpers.o的行将从单个源文件 -helpers.c构建模块。因为这个文件不包含“init”和“exit”函数,所以加载和卸载你的模块什么都不做。
标签: linux linux-kernel kernel kernel-module