未知符号__class_create(错误0)

时间:2015-04-11 14:20:33

标签: c linux-kernel

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

我正在编写一个也会创建角色设备的内核模块。它编译时没有错误和警告,但当我尝试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>

1 个答案:

答案 0 :(得分:11)

仅为GPL模块导出函数__class_create(使用EXPORT_SYMBOL_GPL导出)。因此,您需要使用带有MODULE_LICENSE宏的GPL许可证来使用该功能。其他功能也是如此。

这应该可以解决问题:

MODULE_LICENSE("GPL");

要了解导出的内容,请查看here。基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容以启用访问。这是EXPORT_SYMBOLEXPORT_SYMBOL_GPL宏的目的,它们随处可见。

EXPORT_SYMBOLEXPORT_SYMBOL_GPL之间的区别在于后者仅在模块获得GPL许可时才显示函数或变量。