Я компилирую драйвер, следуя документации. Но когда я пытаюсь загрузить их через
insmod onebox_wlan_nongpl.ko
, я получаю сообщение об ошибке:
insmod: Ошибка: не удалось вставить модуль onebox_wlan_nongpl.ko: Неизвестный символ в модуле
Я знаю, что это из-за неправильного порядка загрузки .ko
файлов, но мне не сообщается, от какого модуля это зависит. Я хотел бы узнать, какой символ неизвестен файлу модуля, который я должен загрузить первым.
решение1
Вы можете просто проверить отсутствующие символы в dmesg с помощью dmesg | tail
. Если вы хотите проверить, есть ли символы на самом деле в вашей таблице символов, проверьте с помощью cat /proc/kallsyms | grep <function_name>
Similar issue:
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
Теперь вставьте оригинальный модуль, и ошибка будет устранена.