compilare un modulo >>>invalide module format

13 risposte [Ultimo messaggio]
Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

Salve a tutti e ben trovati

Questa è una domanda generica fatta per capire meglio il s.o.

s.o mandriva 2008.1 official installata su hard disk a partire da un live cd one

uname-r 2.6.24.7-laptop-2mnb

se io vado ( è un esempio, ma il discorso è piu' generale..) in

/lib/modules/2.6.24.7-laptop-2mnb/kernel/drivers/net/wireless/zd1211rw

trovo un modulo che è

zd1211rw.ko.gz e le cui proprieta sono file gzip etc etc etc.

lsmod mi restituisce tra tutti gli altri moduli

usbcore 126860 5 zd1211rw,uhci_hcd,ohci_hcd,ehci_hcd

Bene, se adesso devo modificare qualcosa in questo modulo, ad esempio aggiungere un nuovo id e vendor, vado in src/ etc etc etc etc , dando per scontato che abbia gli headers e i source esatti del mio kernel, faccio il make e tutto va bene.

Mi crea un zd1211rw.ko cioè un kernel object.

Prendo questo nuovo zd1211rw.ko e lo copio nei modules di prima, cioè in

/lib/modules/2.6.24.7-laptop-2mnb/kernel/drivers/net/wireless/zd1211rw

Solo che nei miei modules i kernel objects sono con estensione gz, cioe credo compressi.

Allora prendo il mio nuovo modulo appena compilato(del vecchio modulo funzionante ho provveduto a fare una copia di backup), lo gzippo con ark, sto attento a dare l'estensione .gz

bene, ho il mio nuovo modulo ottenuto da una compilazione andata a buon fine, l'ho gzippato con qrk...solo che quando vado a fare modprobe zd1211rw.ko.gz mi da invalide module format
me lo da anche se digito modprobe zd1211rw.ko
e anche con modprobe zd121rw

Quello che adesso non riesco a capire è se il modulo è invalido perche compilato male oppure si aspetta qualche altra estensione!!

Suggerimenti?'

Grazie, Fabio

(p.s. avevo gia fatto questa domanda in altro post, ma la discussione non è andata poi avanti Smile )

Ritratto di michele-p
michele-p
(Guru)
Offline
Guru
Iscritto: 22/01/2007
Messaggi: 3268

...il modulo NON va copiato nella relativa cartella in /lib/modules/>versionekernel>/etcetc, bensì il modulo va installato impartendo make install (da utente root) al termine della compilazione e in più è opportuno rigenerare nuovamente le dipendenze con il comando;

depmod -aq

Prima di modificare i sorgenti verifica se il modulo accetta di default i parametri dell'ID e del vendor. Cosa ti restituisce il comando;

modinfo nomemodulo

??

...naturalmene al posto di nomemodulo inserirai il nome del modulo per il quale richiedi le informazioni.

Bye 8-)

Ritratto di Moreno
Moreno
(Guru)
Offline
Guru
Iscritto: 24/09/2004
Messaggi: 16862

Ciao

Hmmm, se durante la compilazione non viene generato automaticamente il ko.gz vuole dire che qualcosa è andato storto perché in genere questa procedura è automatica.

A proposito della tua compressione devi sapere che il gz è una sigla generica per indicare un archivio compresso ma non specifica l'algoritmo di compressione usato e ce ne sono tanti per cui è possibile che semplicemente non venga correttamente riconosciuto (prova a dare un occhiata ai magic number del file che identificano in modo univoco anche l'algoritmo di compressione).

Venendo al modulo zd1211rw esso da un po' di anni è integrato all'interno del kernel forse la soluzione migliori in questi casi è la ricompilazione completa dello stesso, ho scritto una guida tempo fa sull'argomento che trovi qui http://www.mandrakeitalia.org/modules/wfsection/article.php?page=1&articleid=264 alcune cose sono cambiate da allora ma la struttura generale dovrebbe essere rimasta sostanzialmente invariata.

Ciao Ciao, Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.

Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

Buongiorno e grazie
@michele

sei sempre gentilissimo, tra l'altro nell'altro mio post avevi gia risposto ma poi avevo lasciato perdere perche usavo la 2007.1 e li tutto era ok

http://www.mandrakeitalia.org/modules/newbb/viewtopic.php?topic_id=11683&forum=2&post_id=71594#forumpost71594

rifaro' la procedura e postero' il risultato . Comunque ovviamente avevo dato depmod -ae

@moreno

moreno, anche tu sempre disponibile a rispondere, e tra l'altro quella guida è stupenda, l'ho scaricata e stampata e imparata a fondo.

Solo che davvero non ho inteso cosa stavolta non funziona e ovviamente ho voglia di imparare.

Il problema è semplice:
id 0cde vendor 001a

è una zydas in tutto e per tutto, ho semplicemente editato il modulo che mi interessava, cancellato un id e vendor che non mi serviva e sostituito i parametri id e vendor della nuova chiavetta.

Sottolineo che su 2007.1 la procedura è filata come l'olio, anzi su svariate 2007.1 anche di amici, ma li in modules i kernel objects sono estensione ko e non ko.gz....come nella 2008.1

Vi faccio sapere cosa riesco a combinare, grazie

Fabio

p.s. e se uno poi volesse patchare con questo

http://www.aircrack-ng.org/doku.php?id=zd1211rw

la procedura dice che non crea un ko.gz, ma un ko da copiare manualmente nei modules...

Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

Mi sono bloccato a questo:
[root@localhost zd1211rw]# make -C /usr/src/linux-2.6.24.7-2mnb/ M=`pwd` modules

make: Entering directory `/usr/src/linux-2.6.24.7-2mnb'
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_chip.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_ieee8021 1.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_mac.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_netdev.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_rf_al223 0.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_rf_rf295 9.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_rf_al723 0b.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_rf_uw245 3.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_rf.o
CC [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd_usb.o
LD [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd1211rw.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd1211rw.mo d.o
LD [M] /usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw/zd1211rw.ko
make: Leaving directory `/usr/src/linux-2.6.24.7-2mnb'

Ho dovuto dare il comando da root non da utente semplice

questo comando m ha generato nella cartella

/usr/src/linux-2.6.24.7-2mnb/drivers/net/wireless/zd1211rw

un sacco di cose, tra cui il zd1211rw.ko che sarebbe il modulo che mi serve

Soltanto che se ora faccio il make install mi restituisce:

[root@localhost zd1211rw]# make install
make: *** No rule to make target `install'. Stop.
[root@localhost zd1211rw]#

no rule to make install ???????

E perche?

Fabio

Ritratto di michele-p
michele-p
(Guru)
Offline
Guru
Iscritto: 22/01/2007
Messaggi: 3268

...a questo punto se provi a copiare manualmente il modulo così ottenuto te lo carica oppure ti fornisce l'errore che hai indicato in precedenza?...diversamente da quanto ho scritto nell'altro post, può essere copiato manualmente il modulo così creato....

Bye 8-)

Ritratto di markov
markov
(Geek)
Offline
Geek
Iscritto: 19/09/2005
Messaggi: 52

Con la 2008.1 ho sempre avuto problemi con i moduli compilati da me... pensavo che fosse colpa della mia installazione (su eeepc), ma vedo che sono in buona compagnia.

Se l'invalid format si riferisce alla stringa con cui il kernel identifica i moduli compilati, basta dare "modprobe -f <nome_modulo>" per risolvere il problema.

E' un po' brutale, pero' funziona. Il problema sta nel fatto che compilando il modulo, la stringa che identifica il kernel NON e' uguale a quella che lo stesso kernel usa per fare il check prima del caricamento.
Se qualcuno ha scoperto il perche' sono curioso si saperlo.

Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

@michele

se provo a copiare brutalmente il modulo in lib/modules etc etc, insomma dove c'è anche quello che si chiama zd1211rw.ko.gz ( che nel frattempo chiamo.old) e do modprobe zd1211rw,ko oppure zd1211rw.ko.gz oppure zd1211rw mi da sempre invalid module format

sulla 2007.1 questa procedura filava liscia ma perche in modules/drivers/net etc etc etc i modules erano gia *.ko e non *.ko.gz!!!

@markov

be sono contento anche io, iniziavo a pensare di essere un po' imbranato io, eppure sulla 2007.1 ci riuscivo benissimo. I guai per me sono incominciati quando è uscita la 2008 e i suoi *.ko.gz
forse per risparmiare spazio o non so che i moduli sono zippati anzi gizzati Wink

provero' con modprobe -f <nome_modulo>
ma il nome modulo lo do senza nessuna estensione markov? cioe come sempre
modprobe -f zd1211rw ?

ma non è che per caso i moduli sono .gz perche vengono da una installazionde della one da live cd?
Sono cosi anche nella free installata da 4 cd o dvd??

Grazie a entrambi
Fabio

p.s
devo provare a levare completamente dalla directory il modulo vecchio, non soltanto a rinominarlo..lo mettero su floppy e lo cancello da li..
chiisa forse lo trova lo stesso, pur rinominato .old e tenta di caricarlo in base al magic number....

Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

Con modprobe -f funziona perfettamente

Grazie @ markov, ora sarebbe interessante capire anche il perche!

Fabio

Ritratto di michele-p
michele-p
(Guru)
Offline
Guru
Iscritto: 22/01/2007
Messaggi: 3268

"Invalid module format" potrebbe indicare che si sta usando un modulo la cui compilazione è stata effettuata con una versione di Gcc diverso da quello con il quale si è compilato il kernel in uso, oppure che il modulo è stato compilato con/per un kernel non in uso ancora.

Quando provi a caricare il modulo, il comando;

dmesg

cosa riporta?...presumo cheriporti una cosa del tipo "No symbol version for .....".

Bye 8-)

Ritratto di fabiobassa
fabiobassa
(Geek)
Offline
Geek
Iscritto: 16/03/2007
Messaggi: 132

Si Michele, ricordavo che invalide moduel poteva anche dipendere da una differente versione di gcc, pero io ho semplicemente scaricato gli headers del mio kernel e lui da solo si è portato gcc devel e altre cose.

dmesg ( non ci avevo pensato prima, mannaggia..) ora mi ha riportato questo, forse una parte è relativa a prima del tentativo fatto con modprobe -f

zd1211rw: version magic '2.6.24.7-desktop586-2mnb SMP mod_unload 586 ' should be
'2.6.24.7-laptop-2mnb SMP mod_unload 686 '
zd1211rw: no version magic, tainting kernel.

nomina qualcosa che ha a che fare con architettura 686 ( attesa) e 586 trovata...

CMQ ti ripeto che ora come suggerito da markov con modprobe -f va tutto, infatti dmesg ha dato

usbcore: registered new interface driver zd1211rw
udev: renamed network interface eth0 to eth4
zd1211rw 1-8:1.0: firmware version 4725
zd1211rw 1-8:1.0: zd1211b chip 0cde:001a v4810 high 00-60-b3 AL2230_RF pa0 g--NS

e come vedi ha registrato una nuova interfacicia eth4 con 0cde 001a, ovvero proprio quello che io avevo cambiato nel compilare il source.

Certo è che per aggiungere un semplice identifcativo di una chiavetta in tutto e per tutto zydas ( tanto è vero che va benissmo) ho dovuto penare un po'...
Fabio