模块中存在未知符号,但是是什么符号?

模块中存在未知符号,但是是什么符号?

我按照文档编译了一个驱动程序。但是当我尝试通过以下方式加载它们时

insmod onebox_wlan_nongpl.ko

,我收到一条错误消息:

insmod:错误:无法插入模块 onebox_wlan_nongpl.ko:模块中未知符号

我知道这是由于加载.ko文件的顺序错误造成的,但它没有告诉我它依赖于哪个模块。我想知道哪个符号对于我应该首先加载的模块来说是未知的。

答案1

您可以使用 简单地检查 dmesg 中缺失的符号dmesg | tail。如果您想检查符号是否确实在您的符号表中,请使用cat /proc/kallsyms | grep <function_name> 类似问题进行检查: https://ubuntuforums.org/showthread.php?t=1360950

答案2

要查看哪些符号实际上缺失,请使用 查看内核日志dmesg。它将向您显示确切的符号。如果您自己编写了内核模块,并且它依赖于设备映射框架之类的框架,则必须先加载依赖项。下面是我遇到的一个例子:

我写了一个设备映射器,这取决于设备映射框架。插入时,会发生以下情况:

$ sudo insmod some-module.ko
insmod: ERROR: could not insert module some-module.ko: Unknown symbol in module

检查内核日志:

$ sudo dmesg
[     XX.XXXXXX] some-module.ko: Unknown symbol dm_per_bio_data (err -2)
[     XX.XXXXXX] some-module.ko: Unknown symbol dm_put_device (err -2)
...

检查已加载的模块:

$ lsmod | grep dm
<NOTHING>

插入设备映射目标驱动程序:

$ sudo modprobe dm_mod
$ lsmod | grep dm
dm_mod            184320 0

现在插入原始模块,错误就解决。

相关内容