"Nessuna versione di simbolo per module_layout" quando si tenta di caricare usbhid.ko


27

Sto cercando di creare il mio modulo per usbhid.ko, ma dopo averlo compilato, non riesco a caricare il modulo. dmesgdice no symbol version for module_layout. Mi chiedo qual è il problema? Ho già usato il sorgente del kernel fornito da Ubuntu e mi sono anche assicurato che la versione del kernel fosse la stessa.

Risposte:


22

In particolare, il problema è che quando hai compilato il tuo modulo, probabilmente nella struttura ad albero del kernel mancava il file Modules.symvers. Il sistema kbuild in realtà ti avverte di questo quando compili il tuo modulo. Se manca Modules.symvers, vedrai:

Avvertenza: manca la versione del simbolo dump /usr/src/linux-2.6.34-12/Modules.symvers; i moduli non avranno dipendenze e modifiche.

Se il tuo kernel è CONFIG_MODVERSIONSabilitato, durante la fase modpost della costruzione del tuo driver eseguirà script / mod / modpost con l'opzione -m. Se sei coraggioso e dai un'occhiata al sorgente script / mod / modpost.c , vedrai che l'opzione -m aggiunge il simbolo _module_layout_ da vmlinux, tuttavia se non hai Modules.symvers dal tuo kernel, non otterrai il valore CRC per questo simbolo e finirai con questo messaggio di errore.

Quindi ci sono due modi per aggirare questo.

1) eseguire una build completa del kernel in esecuzione per generare Modules.symvers, quindi ricostruire il modulo. [Http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt][1]

51  === 2. How to Build External Modules
52  
53  To build external modules, you must have a prebuilt kernel available
54  that contains the configuration and header files used in the build.
55  Also, the kernel must have been built with modules enabled. If you are
56  using a distribution kernel, there will be a package for the kernel you
57  are running provided by your distribution.
58  
59  An alternative is to use the "make" target "modules_prepare." This will
60  make sure the kernel contains the information required. The target
61  exists solely as a simple way to prepare a kernel source tree for
62  building external modules.
63  
64  NOTE: "modules_prepare" will not build Module.symvers even if
65  CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66  executed to make module versioning work.

2) L'altra opzione è quella di dire allo stupido modprobe di ignorare tutta quella merda e caricare comunque il modulo:

modprobe -f <module>

Tendo a favorire l'opzione 2 :)


1
+1 per "Dillo allo stupido modprobe di ignorare tutta quella merda e di caricare comunque il tuo modulo".
Hayri Uğur Koltuk

Ho provato 2 e ho scoperto che il modulo non si carica automaticamente all'avvio. c'è un modo per -f all'avvio?
Justin Zhang,

17

Avere sia la linux-headerse linux-sourcepacchetti di corrispondenti alla vostra kernel installato. Ad esempio per il kernel 3.2.0-27-generic-paeè necessario:

  1. linux-headers-3.2.0-27-generic-pae e
  2. linux-source-3.2.0-27-generic-pae.

Nel caso in cui la versione per i pacchetti sopra non corrisponda alla versione del kernel in esecuzione, è necessario sostituirla $(uname -r)con la stringa di versione dal pacchetto del kernel installato dall'alto.
Per l'esempio sopra è la versione del pacchetto 3.2.0-27-generic-pae. Quando si esegue uname -re il suo output è qualcosa di diverso, 3.2.0-27-generic-paeè necessario sostituire ciascuno di $(uname -r)seguito per abbinare la stringa di versione dai pacchetti installati.

  1. cd /usr/src/linux-source-$Version e decomprimere l'archivio .tar.bz2 in posizione e cd nella directory estratta - suppongo che tu l'abbia già fatto
  2. cp /boot/config-$(uname -r) .config nella directory dei sorgenti del kernel
  3. cp /usr/src/linux-headers-$(uname -r)/Module.symvers . nella directory dei sorgenti del kernel

Dopo averlo fatto, nella directory dei sorgenti del kernel, procedere come segue:

  1. make prepare
  2. make scripts
  3. make M=drivers/usb/serial- cambia il percorso dopo M=per soddisfare le tue esigenze

Sfortunatamente, non so come costruire un modulo specifico mantenendo Module.symversintatto. Fare make drivers/usb/serial/option.ko, ad esempio, uccide il Module.symversfile e si finisce con il problema originale. L'uso del M=parametro non lo uccide, ma devi costruire tutti i moduli nel percorso specificato - e non ho ancora trovato un modo per aggirarlo.


Questo sembra il modo migliore per fare le cose, nel caso in cui stai compilando il modulo nella stessa versione ad albero ...
Treviño

2

È necessario utilizzare la configurazione del kernel esattamente identica prima di eseguire make prepare. Inoltre, se lo stai costruendo fuori dall'albero, devi costruirlo contro le intestazioni del kernel esattamente identiche corrispondenti al tuo kernel attualmente in esecuzione (o a quello di destinazione se non lo stai eseguendo al momento della compilazione).


"make mrproper", "cp / boot / config - $ (uname -r) .config", "make oldconfig", "make prepar", "make script" Ho usato queste istruzioni per preparare la compilation. Vorrei sapere se ho copiato il file di configurazione corretto? sembra che ci sia una sola configurazione che corrisponde alla mia versione del kernel in / boot /. scusate la formattazione poiché la casella dei commenti non ha formato ...
SpecC

Sì, sembra corretto. Dove stai invocando la build e, se non dalla directory di livello superiore, quale valore SUBDIRS stai passando?
Daniel T Chen,

Grazie per la risposta. quando ho provato a costruire usbhid.ko. Ho usato questo comando "make modules SUBDIRS = drivers / hid / usbhid"
SpecC

quando ho eseguito il comando "make modules SUBDIRS = drivers / hid / usbhid", ricevo il seguente avviso "ATTENZIONE: manca la versione del simbolo dump /usr/src/linux-source-2.6.31/Module.symvers; i moduli avranno nessuna dipendenza e modversione. "
SpecC

@SpecC Mentre indaga il problema, aggiorna la domanda originale con i passaggi che stai eseguendo. Quindi Dan aggiornerà la sua risposta e continuerai ad aggiornarti finché non lo capirai
Jorge Castro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.