N'est pas d'accord à propos de la version de symbole symbol_name après insmod
Je suis nouveau dans la programmation du noyau.
Pour la mise en œuvre de mon projet, j'ai téléchargé la dernière version stable de noyau (v4.3) de kernel.org.
Juste pour vérifier que j'ai copié quelques fichiers à partir du noyau des répertoires dans mon répertoire de projet. Apporté des modifications à elle et inséré un peu plus de code.
Puis j'ai compilé sur SLES11 noyau Linux à l'aide de
make -C /lib/modules/$(uname -r)/build M=$PWD modules
J'ai utilisé le makefile ci-dessous
obj-m := my_module.o
my_module-objs := module_main.0 other_module1.o other_module2.o other_module3.o
Il compilé avec succès.
Mais quand j'ai essayé de l'insérer dans le noyau à l'aide de
insmod my_sample.ko
Il a démontré ce qui suit
n'est pas d'accord à propos de la version de symbole symbol_name
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que le Noyau du module en utilisant les symboles exportés d'autres modules du noyau qui, dans ce cas semble être le linux InfiniBand RDMA pile exporté des méthodes ou des symboles.
Pour résoudre le symbole des problèmes de la version, copiez le
Module.symvers
fichier à partir de larépertoire et le coller dans votre répertoire de travail courant. Ensuite, vous faites vos modules de nouveau. Maintenant, le
insmod
devrait fonctionner parfaitement bien.Et si vous ne trouvez pas le Module.symvers ou il est vide, puis en créer un à l'aide de
create_Module.symvers.sh
Vous avez besoin pour construire votre module de noyau avec la même version du noyau que vous allez exécuter. Donc si vous avez noyau 4.3 sources que vous avez téléchargé, vous devez compiler que version du noyau et de démarrage avec celle en cours d'exécution avant d'essayer de charger votre noyau.
Vous avez deux solutions alors:
zypper install kernel-source
sur SLES ou une commande équivalente sur les autres distributions.)cat /proc/version
c'est montrerLinux Version 3.0.76-0.11-default (geeko@buildhost) (gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux))
. Alors, quelle version dois-je utiliser ?make-C /lib/modules/$(uname -r)/build M=$PWD modules,
"$(uname -r)" montre que vous êtes de la compilation à l'encontre de la version du noyau que vous utilisez actuellement, donc vous devriez être en mesure de insmod le module dans le noyau actuel si vous n'avez pas changé les en-têtes.
À partir de votre texte,
"Juste pour vérifier que j'ai copié quelques fichiers à partir du noyau des répertoires dans mon répertoire de projet. Apporté des modifications à elle et inséré un peu plus de code."
Si vous avez apporté des modifications à la source du noyau, alors vous pouvez avoir besoin de recompiler le noyau et démarrer avec la nouvelle mise à jour du noyau. Ensuite, vous devriez être en mesure de compiler votre kernel module avec la modification des en-têtes.
Vous ressemble construit contre le droit de noyau.quelque chose à voir avec la façon dont votre noyau est compilé. (Voir Config_conversions). Essayez de --force