2010-04-27 10 views
26

Provo a insmod un modulo legacy del kernel linux portato da me. i seguenti errori compaiono:incompatibilità versione modulo_layout

> sudo insmod camac-mx.ko 
insmod: error inserting 'camac-mx.ko': -1 Invalid module format 
dmesg |tail -n 1 
[1312783.938299] camac_mx: disagrees about version of symbol module_layout 

Come posso risolvere questo problema?

risposta

26

Ciò indica che il modulo è stato compilato con una versione del kernel diversa da quella in esecuzione. Si noti che anche se il kernel in esecuzione e l'origine del kernel hanno lo stesso valore numerico (ad esempio entrambi sono 2.6.31-20-server), se i due utilizzano diverse opzioni di configurazione, si potrebbe vedere questo errore. Controlla anche se ci sono più versioni di questo modulo sulla macchina e assicurati di aver caricato quello corretto.

7

Per risolvere (era difficile).

Innanzitutto, sono necessari i sorgenti e le intestazioni del kernel.

Vai al tuo dir base di kernel, qui /usr/src/linux-source-2.6.35

check uname -r, qui 2.6.35-27-generic

make -C /lib/modules/2.6.35-27-generic/build \ 
SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules 

/lib/modules/2.6.35-27-generic/build -> /usr/src/linux-headers-2.6.35-27-generic

Controllare le dipendenze dei moduli con modinfo o lsmod e caricarli in uno script:

modprobe -r ath5k 
modprobe cfg80211 
modprobe led_class 
modprobe mac80211 
modprobe ath 
insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko 

Con questo metodo, vermagic potrebbe anche essere diversa .... il make modules_install era inutile, ma forse perché i moduli sono presenti in 2 posti diversi (/ lib/modules/extra e .../kernel/drivers), non sostituito ...

modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath /ath5k/ath5k.ko

io veramente non capisco perché è così difficile in Ubuntu 10.10 per fissare/debug di un modulo :(

1

Soluzione rapida e funzionante trovata here.

Basta usare la directory modules/build nel numero makefile, NON /usr/src/linux-source.

make -C /lib/modules/`uname -r`/build ... 
12

Per chi lavora su sistemi che non hanno accesso al kernel, kernel-config o ksyms, se si dispone di un working.ko e la tua incorporato, non-lavoro, broken.ko.

Le probabilità sono che probabilmente non verrà caricato, ma se siete abbastanza disperato di provare;

# modprobe --dump-modversions working.ko 
0x0b11e775  module_layout 
# modprobe --dump-modversions broken.ko 
0x2719d41e  module_layout 

Quindi, utilizzando il vostro editor esadecimale preferito, cambiarlo per abbinare:

00016c70 75 e7 11 0b 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou| 

(Il valore è in senso inverso a causa di ordinazione endian) Ci sarà molto probabilmente un intero gruppo si devono indovinare.Qualcuno potrebbe scrivere uno script perl per fare questo ....

+0

ma non riesco a trovare module_layout, solo un sacco di le_layout. – netawater

+0

@netawater, penso che quello che vedi sia proprio questo: "0x75646f6dda9e78e9 le_layout". Quello che devi cambiare sono i numeri dopo "75646f6d" che è il contenuto esadecimale invertito di "modu". – wangqi060934

0

Ho un sistema Android con un modulo binario (pvrsrvkm per la grafica). Ho costruito kernel dal sorgente per questo sistema. In generale funziona tutto bene, ma con alcune opzioni del kernel .config (per kgdb), il modulo pvrsrvkm non carica con errore "disaccordi sulla versione del simbolo".

Il modulo pvrsrvkm viene caricato da Android in anticipo e quando si guasta il sistema non è utilizzabile senza GUI.

Dal momento che stavo già compilazione del kernel, la mia soluzione rapida è stato quello di disabilitare il controllo della versione con l'aggiunta di una riga (versindex = 0;) per kernel kernel file sorgente/module.c:

static int check_version(Elf_Shdr *sechdrs, 
unsigned int versindex, 
const char *symname, 
struct module *mod, 
const unsigned long *crc, 
const struct module *crc_owner) 
{ 
unsigned int i, num_versions; 
struct modversion_info *versions; 

/* Exporting module didn't supply crcs? OK, we're already tainted. */ 
if (!crc) 
    return 1; 

/* No versions at all? modprobe --force does this. */ 
versindex = 0; // I added this line 
if (versindex == 0) 
    return try_to_force_load(mod, symname) == 0; 
0

Prima nell'origine kernel

make clean ARCH = braccio CROSS_COMPILE = arm-linux-gnueabi-

Modificare il file nel kernel source: Module.symvers cambiamento "Module_layout" con lavorato uno, è possibile cercare il file sul tuo dispositivo

Ricompilate conducente esempio: make -C ~/source-kernel ARCH = braccio CROSS_COMPILE = arm-linux-gnueabihf- DIR =/source-kernel M =/modules/example moduli

check module_layout in voi XXX. ko con: sudo modprobe --dump-modversions XXX.ko

NB

Problemi correlati