我试图安装一个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而不会发生事故,但是当我尝试第二次时,我收到了大量的消息:
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声称他们是未知的符号?
编辑:下面的答案之一build议我将文件复制到/ 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。
编写研华驱动程序时遇到了类似的问题。 这里的操作语句实际上是“无符号版本”。
http://lxr.linux.no/#linux+v2.6.33/Documentation/kbuild/modules.txt的第7部分提供了模块版本控制的详细信息。 7.3节特别感兴趣。 对我来说最简单的解决scheme就是坚持KBUILD_EXTRA_SYMBOLS行(如上面的modules.txt的第526行所述)。 在你的情况下,你可能只需要添加一行
KBUILD_EXTRA_SYMBOLS:= [driver_root] /kernel/core/Module.symvers
到[driver_root] / kernel / USB-4761 / Makefile的顶部。
复制.ko的内核的模块目录,然后运行depmod