Linux говорит, что модуль ядра имеет неизвестный символ, но другой загруженный модуль предоставляет его

Я пытаюсь установить драйвер для USB DAQ box, который, к сожалению, я должен скомпилировать сам. Я считаю, что мне это удалось - у меня есть два файла.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 утверждает, что они неизвестные символы?

Редактировать: один из ответов ниже советовал мне скопировать файлы в /lib/modules и запустить depmod. Так я и сделал, используя опцию depmod -v (verbose). Среди выходных было несколько таких строк:

/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.

2 ответа

У меня были похожие проблемы при компиляции драйверов 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.

Скопируйте .ko в каталог модулей вашего ядра и запустите depmod

Другие вопросы по тегам