未知符号__class_create(错误0)

Tom*_*mir 2 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)
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_SYMBOLEXPORT_SYMBOL_GPL宏的目的,它们随处可见.

之间的区别EXPORT_SYMBOL,并EXPORT_SYMBOL_GPL为后者只显示功能或变量模块是否GPL许可.

  • @Algosub参见[LDD3 book,chapter 2](https://lwn.net/images/pdf/LDD3/ch02.pdf).,第29页. (2认同)