gpt4 book ai didi

c - 未知符号 __class_create (错误 0)

转载 作者:行者123 更新时间:2023-12-01 16:31:46 28 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我在网上查找了几个小时却找不到答案......

我正在编写一个内核模块,它也创建一个字符设备。它编译时没有错误和警告,但是当我尝试 sudo insmod my_mod.ko 时,我得到:

insmod:插入“my_mod.ko”时出错:-1 模块中的未知符号

当我尝试查看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_SYMBOLEXPORT_SYMBOL_GPL 宏的用途,它们随处可见。

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

关于c - 未知符号 __class_create (错误 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29578931/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com