Linux 说内核模块有一个未知符号,但另一个已加载的模块提供了它

Linux 说内核模块有一个未知符号,但另一个已加载的模块提供了它

我正在尝试安装USB DAQ 盒的驱动程序,很烦人,我必须自己编译。我相信我成功了——我有两个 .ko 文件:

-rw-r--r--  1 root  root  45271 2010-03-18 21:24 advdrv_core.ko
-rw-r--r--  1 root  root  24312 2010-03-18 21:24 usb4761.ko

我可以在第一个上运行 insmod 而没有任何意外,但是当我尝试在第二个上运行 insmod 时,我收到大量消息:

kernel: [686782.106547] usb4761: no symbol version for adv_process_info_check_event
kernel: [686782.106555] usb4761: Unknown symbol adv_process_info_check_event
kernel: [686782.106691] usb4761: no symbol version for advdrv_unregister_driver
kernel: [686782.106695] usb4761: Unknown symbol advdrv_unregister_driver

但是,advdrv_core.ko 提供了这些符号。我的内核似乎确实在内存中有它们:

# cat /proc/kallsyms | grep advdrv_unregister_driver
f8d88504 r __ksymtab_advdrv_unregister_driver   [advdrv_core]
f8d888d2 r __kstrtab_advdrv_unregister_driver   [advdrv_core]
f8d885a4 r __kcrctab_advdrv_unregister_driver   [advdrv_core]
086eb8fb a __crc_advdrv_unregister_driver       [advdrv_core]
f8d86e90 t advdrv_unregister_driver     [advdrv_core]

为什么我的 insmod 声称它们是未知符号?

编辑:下面的一个答案建议我将文件复制到 /lib/modules 并运行 depmod。所以我照做了,使用了 depmod 的 -v(详细)选项。输出中有几行,例如:

/lib/modules/2.6.27-7-generic/kernel/drivers/pcmcia/usb4761.ko needs "advdrv_unregister_driver": /lib/modules/2.6.27-7-generic/kernel/drivers/pcmcia/advdrv_core.ko

然后我运行 rmmod advdrv_core 以确保我是全新安装的,运行 modprobe advdrv_core,最后运行 modprobe usb4761。

再次,一堆失败的符号,包括 advdrv_unregister_driver。

答案1

我在编译 Advantech 驱动程序时也遇到过类似的问题。这里的关键词实际上是“无符号版本”。

第 7 条http://lxr.linux.no/#linux+v2.6.33/Documentation/kbuild/modules.txt提供了模块版本控制的详细信息。第 7.3 节特别有趣。对我来说,最简单的解决方案就是坚持一行KBUILD_EXTRA_SYMBOLS(如从526 行上面的 modules.txt )。对于你的情况,你可能只需添加一行,例如

KBUILD_EXTRA_SYMBOLS := <driver_root>/kernel/core/Module.symvers

到 的顶部<driver_root>/kernel/USB-4761/Makefile

答案2

将 .ko 复制到内核的模块目录,然后运行depmod

相关内容