未知符号__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_SYMBOL
和EXPORT_SYMBOL_GPL
宏的目的,它们在任何地方都使用。
EXPORT_SYMBOL
和EXPORT_SYMBOL_GPL
之间的区别在于后者仅在模块获得GPL许可时才显示函数或变量。