LKMPG: Ciao Mondo: differenze tra le versioni

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.
43

contributi