43
contributi
Riga 512: | Riga 512: | ||
depends: | depends: | ||
</pre> | </pre> | ||
Per superare questo problema possiamo ricorrere all'opzione --force-vermagic, ma questa soluzione è potenzialmente insicura, e indiscutibilmente inaccettabile nella produzione di moduli. Di conseguenza, vogliamo compilare il nostro modulo in un ambiente che sia identico a quello in cui il nostro kernel precompilato è stato costruito. Come fare questo è il tema del resto del capitolo. | |||
Prima di tutto, assicurarsi che il codice sorgente del kernel è disponibile e che abbia esattamente la stessa versione del kernel che in esecuzione. Dunque, trova il file di configurazione che è stato usato per compilare il kernel precompilato. Di solito, è disponibile nella directory /boot, sotto un nome tipo config-2.6.x. Potresti volerlo solo copiare nella directory del kernel: '''cp /boot/config-`uname -r` /usr/src/linux-`uname -r`/.config'''. | |||
Concentriamoci di nuovo sul precedente errore: uno sguardo da vicino alle stringe version magic suggeriscono che, anche con due file di configurazione che sono esattamente gli stessi, una piccola differenza nel version magic è possibile, ed è sufficiente a prevenire l'inserimento del modulo nel kernel. Questa piccola differenza, cioè la stringa personalizzata che appare nel version magic del modulo e non in quella del kernel, è dovuta ad una modifica nel makefile, che alcune distribuzioni includono, rispetto all'originale. Quindi, esamina il tuo /usr/src/linux/Makefile ed assicurati che l'informazione della versione specificata è esattamente la stessa di quella usata per il tuo kernel corrente. Per esempio, il tuo makefile potrebbe iniziare cosi: | |||
<pre> | |||
VERSION = 2 | |||
PATCHLEVEL = 6 | |||
SUBLEVEL = 5 | |||
EXTRAVERSION = -1.358custom | |||
... | |||
</pre> | |||
In questo caso, hai bisogno di ripristinare il valore del simbolo EXTRAVERSION a -1.358. Suggeriamo di tenere una copia di backup del makefile usato per compiare il tuo kernel disponibile in <code>/lib/modules/2.6.5-1.358/build</code>. Un semplice '''cp /lib/modules/`uname -r`/build/Makefile /usr/src/linux-`uname -r`''' dovrebbe essere sufficiente. Inoltre, se hai già inziato a compilare il kernel con il precedente (sbagliato) Makefile, dovresti anche rieseguire '''make''', o modificare direttamente il simbolo UTS_RELEASE nel file <code>/usr/src/linux-2.6.x/include/linux/version.h</code> con lo stesso valore presente in <code>/lib/modules/2.6.x/build/include/linux/version.h</code>, o sovrascrivere quest'ultimo sul primo. | |||
Ora, eseguire '''make''' per aggiornare la configurazione, la versione degli headers e gli oggetti: | |||
<pre> | |||
[root@pcsenonsrv linux-2.6.x]# make | |||
CHK include/linux/version.h | |||
UPD include/linux/version.h | |||
SYMLINK include/asm -> include/asm-i386 | |||
SPLIT include/linux/autoconf.h -> include/config/* | |||
HOSTCC scripts/basic/fixdep | |||
HOSTCC scripts/basic/split-include | |||
HOSTCC scripts/basic/docproc | |||
HOSTCC scripts/conmakehash | |||
HOSTCC scripts/kallsyms | |||
CC scripts/empty.o | |||
... | |||
</pre> | |||
Se non desideri compiare il kernel attualmente, puoi interrompere il processo ('''CTRL-C''') subito dopo la linea che inizia per <code>SPLIT</code> poichè in quel momento i file che ti servono saranno già pronti. Ora puoi tornare indietro alla directory del tuo modulo e compilarlo: sarà compilato correttamente in accordo con le impostazioni del tuo kernel corrente e verrà caricato senza nessun errore. |
contributi