这可能是一个愚蠢的问题,但我在网上找了几个小时,却找不到答案......
我正在编写一个也会创建角色设备的内核模块。它编译时没有错误和警告,但当我尝试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>
答案 0 :(得分:11)
仅为GPL模块导出函数__class_create(使用EXPORT_SYMBOL_GPL
导出)。因此,您需要使用带有MODULE_LICENSE
宏的GPL许可证来使用该功能。其他功能也是如此。
这应该可以解决问题:
MODULE_LICENSE("GPL");
要了解导出的内容,请查看here。基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容以启用访问。这是EXPORT_SYMBOL
和EXPORT_SYMBOL_GPL
宏的目的,它们随处可见。
EXPORT_SYMBOL
和EXPORT_SYMBOL_GPL
之间的区别在于后者仅在模块获得GPL许可时才显示函数或变量。