未知符号 __class_create(错误 0)
unknown symbol __class_create (err 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 <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>
函数 __class_create 仅针对 GPL 模块导出(使用 EXPORT_SYMBOL_GPL
导出)。因此,您需要使用带有 MODULE_LICENSE
宏的 GPL 许可证才能使用该功能。其他功能也一样。
这应该可以解决问题:
MODULE_LICENSE("GPL");
要了解什么是导出,请查看 here。基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容才能访问。这就是 EXPORT_SYMBOL
和 EXPORT_SYMBOL_GPL
宏的目的,它们无处不在。
而EXPORT_SYMBOL
和EXPORT_SYMBOL_GPL
的区别在于,如果模块是GPL许可的,后者只显示函数或变量。
这可能是个愚蠢的问题,但我在网上找了几个小时也找不到答案...
我正在编写一个内核模块,它也可以创建一个字符设备。它编译时没有错误和警告,但是当我尝试 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>
函数 __class_create 仅针对 GPL 模块导出(使用 EXPORT_SYMBOL_GPL
导出)。因此,您需要使用带有 MODULE_LICENSE
宏的 GPL 许可证才能使用该功能。其他功能也一样。
这应该可以解决问题:
MODULE_LICENSE("GPL");
要了解什么是导出,请查看 here。基本上,动态模块无法访问内核中的变量和函数,内核需要指定要导出的内容才能访问。这就是 EXPORT_SYMBOL
和 EXPORT_SYMBOL_GPL
宏的目的,它们无处不在。
而EXPORT_SYMBOL
和EXPORT_SYMBOL_GPL
的区别在于,如果模块是GPL许可的,后者只显示函数或变量。