Come generare Module.symvers?


14

Di recente ho passato in rassegna Unpacking rpm off-system di origine kernel (OpenSuse)? ; e dato che ci sono voluti> 10 h sulla mia macchina, immagina la mia sorpresa che dopo aver fatto il processo descritto lì, non trovo da nessuna Module.symversparte!

Quando cerco "generate Module.symvers", ottengo questo:

NOTA: "modules_prepare" non costruirà Module.symvers anche se
è impostato CONFIG_MODVERSIONS ; pertanto, è necessario
eseguire una build completa del kernel per far funzionare il controllo delle versioni del modulo.
( Documentazione del kernel Linux :: kbuild: modules.txt )

... ma non lo capisco davvero - il kernel non è stato compilato nel passaggio precedente (descritto nel link sopra indicato? Sono sicuro che ci sono voluti> 10 h perché CC generasse un intero gruppo di * .o file e LD per collegarli, quindi qualcosa deve essere stato costruito. Ma se è così, dov'è Module.symvers?

In termini più espliciti, esattamente quale comando dovrei chiamare per generare Module.symvers? So che make preparenon funzionerà, ma qual è il comando che funzionerà?


Cordiali saluti, su openSUSE, è possibile ottenere Module.symversda zypper install kernel-source, e simili su altre distro linux. Il file si trova in lib/modules/xxx/build.
Syrtis Major

Risposte:


16

Il Module.symversè (ri) generato quando si (ri) Compila moduli. Esegui make modulese dovresti ottenere un Module.symversfile nella radice dell'albero del kernel.

Nota che se hai solo eseguito makee no make modules, non hai ancora creato alcun modulo. Sono presenti i simboli del kernel stesso ( vmlinuxo uno dei formati di immagine dipendenti dall'architettura) System.map.


Mille grazie per questo, @Gilles - Da allora avevo trovato anche la risposta: File Module.symvers ; e posso confermare che make modulescrea davvero Module.symvers. Grazie anche per chiarire la differenza tra makee make modulese relazione con System.map. Saluti!
sdaau,

Cosa succede se "make" non è disponibile sulla macchina?
bzupnick,

3
@bzupnick Installalo. È uno degli strumenti necessari per creare moduli del kernel Linux. Un sacco di software richiede make to build.
Gilles 'SO- smetti di essere malvagio' il

Sto cercando di compilare in modo incrociato un LKM da un'altra macchina. Non è possibile installare cose sul primo riquadro.
bzupnick,

@bzupnick Devi comunque creare make per compilare il modulo. Sta succedendo tutto sulla macchina build, non c'è niente da fare sulla macchina target tranne insmod.
Gilles 'SO- smetti di essere malvagio' il

3

per le persone che hanno trovato questa domanda cercando su Google l'avvertimento ricevuto durante la compilazione di uno degli LKM di esempio di Derek Molloy: puoi semplicemente crearne uno vuoto touch Modules.symvers. se il tuo kernel non usa le modversioni (i CRC usati dal sistema operativo per assicurare che i moduli corrispondano al kernel) e il tuo modulo non ha dipendenze da altri moduli, questo sarà abbastanza buono da sopprimere l'avvertimento.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

il file vuoto è buono quanto quello generato da gcc, che ha solo i simboli tutti con lo stesso 0x00000000valore CRC, su un sistema senza modifiche.


1

Su CentOS e forse altre varianti di RedHat, basta estrarre il file corrispondente per il kernel in esecuzione:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

Su Ubuntu e forse altre varianti di Debian, le cuciture dei file si trovano automaticamente. Tuttavia, se necessario, il file è qui:

/usr/src/linux-headers-$(uname -r)/Module.symvers

Non riesco a trovare la linux-headers-$(uname -r)cartella
King Stone,
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.