未知符号__class_create(错误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  #include  #include  #include  #include  #include  #include  

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

这应该是诀窍:

 MODULE_LICENSE("GPL"); 

要了解导出的内容,请查看此处 。 基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容以启用访问。 这是EXPORT_SYMBOLEXPORT_SYMBOL_GPL宏的目的,它们在任何地方都使用。

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