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;