O Linux diz que um módulo do kernel tem um símbolo desconhecido, mas outro módulo carregado o fornece

3

Estou tentando instalar um driver para uma caixa de DAQ USB , que irritantemente, eu tenho que me recompor. Eu acredito que eu consegui - eu tenho dois arquivos .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

Consegui executar o insmod no primeiro sem incidentes, mas, quando experimento o segundo, recebo uma enxurrada de mensagens:

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

No entanto, advdrv_core.ko fornece esses símbolos. Meu kernel com certeza parece tê-los na memória:

# 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]

Por que meu insmod afirma que eles são símbolos desconhecidos?

Edit: Uma das respostas abaixo me avisou para copiar os arquivos para / lib / modules e rodar o depmod. Então eu fiz, usando a opção -v (verbose) do depmod. Entre os resultados, havia um monte de linhas como:

/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

Em seguida, executei rmmod advdrv_core para ter certeza de que estava instalando, executei o modprobe advdrv_core e finalmente executei o modprobe usb4761.

Novamente, um monte de símbolos com falha, incluindo advdrv_unregister_driver.

    
por raldi 19.03.2010 / 05:47

2 respostas

4

Eu tive problemas semelhantes ao compilar os drivers da Advantech. A frase operativa aqui é realmente "sem versão de símbolo".

A seção 7 do link fornece detalhes sobre o versionamento de módulo. A seção 7.3 é de particular interesse. A solução mais simples para mim era apenas inserir uma linha KBUILD_EXTRA_SYMBOLS (como descrito a partir da linha 526 do modules.txt acima). No seu caso, você provavelmente poderia adicionar apenas uma linha como

KBUILD_EXTRA_SYMBOLS: = [driver_root] /kernel/core/Module.symvers

no topo do [driver_root] / kernel / USB-4761 / Makefile.

    
por 22.04.2010 / 06:12
0

copie os .ko's para o diretório do seu kernel e execute depmod

    
por 19.03.2010 / 06:00