unload modules modprobe arch module linux-kernel

modules - incompatibilidad de la versión módulo_layout



modules linux (6)

Intento inscribir un módulo legado del kernel de Linux que estoy portando. Aparecen los siguientes errores:

> 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

¿Cómo puedo solucionar esto?


Antes en su fuente kernel

limpiar ARCH = brazo CROSS_COMPILE = arm-linux-gnueabi-

Edite el archivo en el kernel de origen: Module.symvers cambia "Module_layout" con uno trabajado, puede buscar este archivo en su dispositivo

Ejemplo de compilación del controlador: make -C ~ / source-kernel ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- DIR = / source-kernel M = / modules / example modules

Compruebe module_layout en usted XXX.ko con: sudo modprobe --dump-modversions XXX.ko

nótese bien


Esto indica que ha compilado el módulo contra una versión diferente del kernel de la que se está ejecutando. Tenga en cuenta que incluso si el kernel en ejecución y la fuente del kernel tienen el mismo valor numérico (por ejemplo, ambos son 2.6.31-20-server), si los dos usan diferentes opciones de configuración, puede ver este error. También compruebe si hay varias versiones de este módulo en la máquina y asegúrese de que está cargando la correcta.


Para aquellos que trabajan en sistemas sin acceso a kernel, kernel-config o ksyms, si tiene un working.ko y su construido, non-working, broken.ko .

Es probable que no se cargue, pero si estás lo suficientemente desesperado como para intentarlo;

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

Luego, utilizando su editor hexadecimal favorito, cámbielo para que coincida:

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

(El valor está en reversa debido al pedido de endian) Es muy probable que haya un grupo completo con el que tenga que coincidir. Alguien podría escribir un script en perl para hacer esto ...


Para resolver eso (fue difícil).

Primero, necesitas las fuentes del núcleo y los encabezados.

Vaya al directorio de la base de su núcleo, aquí /usr/src/linux-source-2.6.35

Compruebe uname -r , aquí 2.6.35-27-genérico

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

Verifique las dependencias del módulo con modinfo o lsmod y cárguelos en un 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 este método, vermagic también podría ser diferente ... la instalación de modules_install fue inútil, pero tal vez porque los módulos están presentes en 2 lugares diferentes (/ lib / modules / extra y ... / kernel / drivers), no reemplazados. .

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

Realmente no entiendo por qué es tan difícil en Ubuntu 10.10 arreglar / depurar un módulo :(


Solución rápida y de trabajo se encontró here .

Simplemente use el directorio modules/build en su makefile , NO /usr/src/linux-source .

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


Tengo sistema Android con un módulo binario (pvrsrvkm para gráficos). He estado construyendo núcleos desde la fuente para este sistema. En general, todo funciona bien, pero con algunas opciones de configuración de kernel (para kgdb), el módulo pvrsrvkm no se cargaría con el error "no está de acuerdo con la versión del símbolo".

Android carga temprano el módulo pvrsrvkm y, cuando falla, el sistema no se puede utilizar sin GUI.

Como ya estaba compilando el kernel, mi solución rápida fue deshabilitar la verificación de versiones agregando una línea (versindex = 0;) al archivo fuente del kernel kernel / 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;