未知符号 __class_create(错误 0)

unknown symbol __class_create (err 0)

这可能是个愚蠢的问题,但我在网上找了几个小时也找不到答案...

我正在编写一个内核模块,它也可以创建一个字符设备。它编译时没有错误和警告,但是当我尝试 sudo insmod my_mod.ko 时,我得到:

insmod: error inserting 'my_mod.ko': -1 Unknown symbol in module

当我尝试查看 dmesg 时,我看到:

my_mod: Unknown symbol __class_create (err 0)
my_mod: Unknown symbol device_create_file (err 0)
my_mod: Unknown symbol device_create (err 0)

我猜我错过了一个 include 但我找不到哪个...

需要哪些内容?

我目前的收录是:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ip.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/cdev.h>
#include <linux/fs.h>

函数 __class_create 仅针对 GPL 模块导出(使用 EXPORT_SYMBOL_GPL 导出)。因此,您需要使用带有 MODULE_LICENSE 宏的 GPL 许可证才能使用该功能。其他功能也一样。

这应该可以解决问题:

MODULE_LICENSE("GPL");

要了解什么是导出,请查看 here。基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容才能访问。这就是 EXPORT_SYMBOLEXPORT_SYMBOL_GPL 宏的目的,它们无处不在。

EXPORT_SYMBOLEXPORT_SYMBOL_GPL的区别在于,如果模块是GPL许可的,后者只显示函数或变量。