Eu compilo um driver seguindo as documentações. Mas quando tento carregá-los via
insmod onebox_wlan_nongpl.ko
, recebo uma mensagem de erro:
insmod: Erro: não foi possível inserir o módulo onebox_wlan_nongpl.ko: Símbolo desconhecido no módulo
Eu sei que isso se deve à ordem errada de carregamento .ko
dos arquivos, mas isso não me diz de qual módulo ele depende. Gostaria de saber qual símbolo é desconhecido para arquivar o módulo que devo carregar primeiro.
Responder1
Você pode simplesmente verificar os símbolos ausentes no dmesg usando dmesg | tail
. Se você quiser verificar se os símbolos estão realmente em sua tabela de símbolos, verifique usando cat /proc/kallsyms | grep <function_name>
um problema semelhante:
https://ubuntuforums.org/showthread.php?t=1360950
Responder2
Para ver quais símbolos estão realmente faltando, consulte o log do kernel usando dmesg
. Ele mostrará os símbolos exatos. Se você mesmo escreveu o módulo do kernel e ele, por exemplo, depende de uma estrutura como a estrutura de mapeamento de dispositivos, a dependência deve ser carregada primeiro. Aqui está um exemplo que encontrei:
Eu escrevi ummapeador de dispositivos, que depende da estrutura de mapeamento de dispositivos. Na inserção, isso acontece:
$ sudo insmod some-module.ko
insmod: ERROR: could not insert module some-module.ko: Unknown symbol in module
Inspecione o log do kernel:
$ 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)
...
Inspecione os módulos carregados:
$ lsmod | grep dm
<NOTHING>
Insira o driver de destino de mapeamento de dispositivo:
$ sudo modprobe dm_mod
$ lsmod | grep dm
dm_mod 184320 0
Agora insira o módulo original e o erro será resolvido.