`module_init` 函数由于将模块拆分为多个源文件而拒绝执行
`module_init` function refuse to execute as a result of splitting the module into multiple source files
我目前正在研究内核模块。这是一个重现我的问题的简约模块。
main_module.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include "other_functions.h"
MODULE_LICENSE("GPL");
int major = 0;
struct file_operations fops = {
.owner = THIS_MODULE,
};
int __init main_module_init(void) {
printk(KERN_INFO "<main_module> Hello World!\n");
major = register_chrdev(0, "main_module", &fops);
test();
return 0;
}
void __exit main_module_exit(void) {
unregister_chrdev(major, "main_module");
printk(KERN_INFO "<main_module> goodbye\n");
}
module_init(main_module_init);
module_exit(main_module_exit);
other_functions.c:
#include "other_functions.h"
int test(void) {return 0;}
other_functions.h:
#ifndef OTHER_FUNCTIONS
#define OTHER_FUNCTIONS
#include <linux/module.h>
MODULE_LICENSE("GPL");
int test(void);
#endif
生成文件:
obj-m += main_module.o
main_module-objs := other_functions.o
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
在我编译模块并加载它之后,dmesg | grep main_module
什么都不输出,而我应该得到 <main_module> Hello World!
作为输出。
但是,如果我删除 main_module.c
中的第 4 行:#include "other_functions.h
,
Makefile
中的第 3 行:main_module_objs := ...
。 dmesg | grep main_module
命令将在重新编译模块并重新加载后给我请求的输出。
有人可以向我解释如何解决这个问题吗?我真的无法理解这种行为。非常感谢!
PS:我正在开发 Ubuntu 12.04,我的内核版本是 3.2.0-37-generic-pae
我终于弄清楚出了什么问题。
问题出在 Makefile 中。目标文件 main_module.o
未链接。
所以我编辑了 makefile 并解决了问题:
生成文件:
obj-m += target.o # Here I changed the target's name so it's not interfering with any other dependency
target-objs := main_module.o other_functions.o # I added main_module to the dependencies
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
我目前正在研究内核模块。这是一个重现我的问题的简约模块。
main_module.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include "other_functions.h"
MODULE_LICENSE("GPL");
int major = 0;
struct file_operations fops = {
.owner = THIS_MODULE,
};
int __init main_module_init(void) {
printk(KERN_INFO "<main_module> Hello World!\n");
major = register_chrdev(0, "main_module", &fops);
test();
return 0;
}
void __exit main_module_exit(void) {
unregister_chrdev(major, "main_module");
printk(KERN_INFO "<main_module> goodbye\n");
}
module_init(main_module_init);
module_exit(main_module_exit);
other_functions.c:
#include "other_functions.h"
int test(void) {return 0;}
other_functions.h:
#ifndef OTHER_FUNCTIONS
#define OTHER_FUNCTIONS
#include <linux/module.h>
MODULE_LICENSE("GPL");
int test(void);
#endif
生成文件:
obj-m += main_module.o
main_module-objs := other_functions.o
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
在我编译模块并加载它之后,dmesg | grep main_module
什么都不输出,而我应该得到 <main_module> Hello World!
作为输出。
但是,如果我删除 main_module.c
中的第 4 行:#include "other_functions.h
,
Makefile
中的第 3 行:main_module_objs := ...
。 dmesg | grep main_module
命令将在重新编译模块并重新加载后给我请求的输出。
有人可以向我解释如何解决这个问题吗?我真的无法理解这种行为。非常感谢!
PS:我正在开发 Ubuntu 12.04,我的内核版本是 3.2.0-37-generic-pae
我终于弄清楚出了什么问题。
问题出在 Makefile 中。目标文件 main_module.o
未链接。
所以我编辑了 makefile 并解决了问题:
生成文件:
obj-m += target.o # Here I changed the target's name so it's not interfering with any other dependency
target-objs := main_module.o other_functions.o # I added main_module to the dependencies
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules