这可能是一个愚蠢的问题,但我在网上找了几个小时,找不到答案......
我正在编写一个内核模块,它也可以创建一个字符设备.它编译时没有错误和警告,但是当我尝试时,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)
Run Code Online (Sandbox Code Playgroud)
我猜我错过了一个,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>
Run Code Online (Sandbox Code Playgroud)
hol*_*gac 11
函数__class_create仅为GPL模块导出(导出为EXPORT_SYMBOL_GPL).因此,您需要使用带有MODULE_LICENSE宏的GPL许可证来使用该功能.其他功能也是如此.
这应该做的伎俩:
MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)
要了解导出的内容,请查看此处.基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容以启用访问.这是EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏的目的,它们随处可见.
之间的区别EXPORT_SYMBOL,并EXPORT_SYMBOL_GPL为后者只显示功能或变量模块是否GPL许可.