J'essaie d'insmoder un module hérité du noyau linux porté par moi. Les erreurs suivantes apparaissent:
> 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
Comment puis-je réparer ça?
Cela indique que vous avez compilé le module avec une version du noyau différente de celle en cours d'exécution. Notez que même si le noyau en cours d'exécution et la source du noyau ont la même valeur numérique (par exemple, les deux sont 2.6.31-20-server), si les deux utilisent des options de configuration différentes, vous pouvez voir cette erreur. Vérifiez également s'il existe plusieurs versions de ce module sur la machine et assurez-vous de charger la bonne.
Pour ceux qui travaillent sur des systèmes sans accès au noyau, kernel-config ou ksymes, si vous avez un working.ko
et votre construit, non fonctionnel, broken.ko
.
Il y a des chances qu'il ne se charge probablement pas, mais si vous êtes assez désespéré pour essayer;
# modprobe --dump-modversions working.ko
0x0b11e775 module_layout
# modprobe --dump-modversions broken.ko
0x2719d41e module_layout
Ensuite, en utilisant votre éditeur hexadécimal préféré, modifiez-le pour qu'il corresponde:
00016c70 75 e7 11 0b 6d 6f 64 75 6c 65 5f 6c 61 79 6f 75 |u...module_layou|
(La valeur est inversée en raison de l'ordre endian) Il y aura très probablement un tas entier que vous devrez faire correspondre. Quelqu'un pourrait écrire un script Perl pour ce faire ....
Pour résoudre cela (c'était difficile).
Tout d'abord, vous avez besoin des sources et des en-têtes du noyau.
Allez dans le répertoire de base de votre noyau, ici / usr/src/linux-source-2.6.35
Vérifiez name -r, ici 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
Vérifiez les dépendances du module avec modinfo ou lsmod et chargez-les dans 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
Avec cette méthode, vermagic pourrait également être différent .... le make modules_install était inutile, mais peut-être parce que les modules sont présents à 2 endroits différents (/ lib/modules/extra et .../kernel/drivers), non remplacés .. .
modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko
Je ne comprends pas vraiment pourquoi il est si difficile dans Ubuntu 10.10 de corriger/déboguer un module :(
Une solution rapide et fonctionnelle a été trouvée ici .
Utilisez simplement modules/build
répertoire dans votre makefile
, PAS /usr/src/linux-source
.
make -C /lib/modules/`uname -r`/build ...
J'ai Android avec un module binaire (pvrsrvkm pour les graphiques). J'ai construit des noyaux à partir de la source pour ce système. En général, tout fonctionne bien, mais avec quelques options de noyau .config (pour kgdb ), le module pvrsrvkm ne se chargerait pas avec l'erreur "désaccord sur la version du symbole".
Le module pvrsrvkm est chargé par Android tôt et quand il échoue, le système est inutilisable sans interface graphique).
Comme je construisais déjà le noyau, ma solution rapide consistait à désactiver la vérification de version en ajoutant une ligne (versindex = 0;) au fichier source du noyau 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;
Avant dans votre noyau source
make clean Arch = arm CROSS_COMPILE = arm-linux-gnueabi-
Modifiez le fichier dans le noyau source: Module.symvers changez "Module_layout" avec un travaillé, vous pouvez rechercher ce fichier sur votre appareil
Exemple de pilote de recompilation: make -C ~/source-kernel Arch = arm CROSS_COMPILE = arm-linux-gnueabihf- DIR =/source-kernel M =/modules/example modules
Vérifiez module_layout en vous XXX.ko avec: Sudo modprobe --dump-modversions XXX.ko
NB