GNU/Linux >> Linux Esercitazione >  >> Linux

Non è d'accordo sulla versione del simbolo symbol_name dopo insmod

Devi costruire il tuo modulo del kernel sulla stessa versione del kernel che stai per eseguire. Quindi, se hai i sorgenti del kernel 4.3 che hai scaricato, devi compilare quelli versione del kernel e avviare con quella in esecuzione prima di provare a caricare il kernel.

Allora hai due soluzioni:

  1. Scarica i sorgenti del kernel per il kernel attualmente in esecuzione (puoi installarli con zypper install kernel-source su SLES o un comando equivalente su altre distribuzioni.)
  2. Compila e installa il kernel 4.3 nel tuo sistema operativo. Se hai bisogno di aiuto con questo, fai una domanda separata (e probabilmente appartiene al superutente non qui). Nota che se kernel e glibc sono strettamente accoppiati, è possibile che tu non possa eseguire un nuovo kernel se hai una libreria C molto vecchia.

make -C /lib/modules/$(uname -r)/build M=$PWD modules,"$(uname -r)" mostra che stai compilando rispetto alla versione del kernel che stai eseguendo ora, quindi dovresti essere in grado di insmod il modulo nel kernel corrente se non hai cambiato le intestazioni.

Dal tuo testo, "Solo per controllare, ho copiato alcuni file dalle directory del kernel nella directory del mio progetto. Ho apportato modifiche e inserito altro codice."

Se hai apportato modifiche al sorgente del kernel, potrebbe essere necessario ricompilare il nuovo kernel e avviare con il nuovo kernel aggiornato. Quindi dovresti essere in grado di compilare il modulo del kernel con le intestazioni modificate.


Il problema qui è che il modulo del kernel utilizza i simboli esportati di altri moduli del kernel che in questo caso sembrano essere i metodi o i simboli esportati dello stack Linux InfiniBand RDMA.

Per risolvere i problemi relativi alla versione del simbolo, copia il Module.symvers file dal

/usr/src/ofa-kernel

directory e incollala nella directory di lavoro corrente. Quindi crei di nuovo i tuoi moduli. Ora il insmod dovrebbe funzionare perfettamente.

NOTA:il file Module.symvers contiene informazioni su tutti i simboli esportati da kernelmodule. Quindi, copiandolo nella tua directory di lavoro, aiuterai kbuild a saperne di più sui simboli esportati usati.

E se non trovi Module.symvers o è vuoto, creane uno usando create_Module.symvers.sh


Linux
  1. Linux:come ricaricare correttamente un modulo del kernel?

  2. Come posso usare ioctl() per manipolare il mio modulo del kernel?

  3. modifiche ai parametri del modulo del kernel (usando /sys/module)

  4. È possibile sviluppare il modulo del kernel Linux in CLion?

  5. Cos'è un kernel contaminato in Linux?

Come caricare o scaricare un modulo del kernel Linux

Ubuntu versione 22.04 del kernel

Come controllare la versione del kernel in Linux

Comando Modprobe in Linux

copy_to_user non definito nel kernel Linux versione 4.12.8

Salta il modulo del kernel all'avvio