gpt4 book ai didi

c - `module_init` 将模块拆分成多个源文件导致函数拒绝执行

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:05 25 4
gpt4 key购买 nike

我目前正在研究内核模块。这是一个重现我的问题的简约模块。

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;}

其他函数.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

关于c - `module_init` 将模块拆分成多个源文件导致函数拒绝执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33451995/

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