je suis débutant et j'essaie quelques bases de la programmation du noyau sous Linux. Aujourd'hui, j'ai ouvert le fichier module.h dans VIM et je l'ai fermé sans enregistrer les modifications. Après cela, je ne peux plus compiler aucun de mes codes. Je reçois le message d'erreur suivant
[root@localhost helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[root@localhost helloworld]#
Voici un exemple de code qui a fonctionné avec succès jusqu'au dernier jour.
#include<linux/module.h>
#include<linux/kernel.h>
int init_module(void)
{
printk("HELLO WORLD");
return 0;
}
void cleanup_module(void)
{
printk("GOODBYE");
}
J'ai cherché le fichier module.h comme suit et il existe
[root@localhost usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[root@localhost usr]#
S'il vous plaît, aidez-moi… .. J'utilise CentOS dans une boîte virtuelle.
Vous essayez de compiler votre module avec plain gcc
sans utiliser le framework kbuild environnant. Vous avez peut-être déjà obtenu quelque chose à travailler avec cette approche, mais il est douloureux horrible, horrible, d'essayer de maintenir un module en utilisant autre chose qu'une approche pure-kbuild Makefile
. J'ai trop gaspillé ma vie à lutter contre kbuild et je ne veux pas que la même chose se produise. Empruntez kbuild et laissez-le vous aider à construire votre module. Veuillez lire Documentation/kbuild/modules.txt
avant d'écrire une autre ligne de code.
Ce que vous devez faire est de créer un Makefile
pour votre module. Son contenu devrait ressembler à ceci:
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := modulename.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
endif
Je sais que c'est beaucoup plus compliqué que la plupart des Makefile
s que vous avez l'habitude de voir, mais cela a un double objectif. Si vous n’exécutez que make
dans votre répertoire, il invoquera à nouveau make
pour utiliser le mécanisme kbuild du noyau en cours d’exécution (supposé au moins avoir un lien symbolique de /lib/modules/.../build
vers le bon emplacement).
La commande _make
($(MAKE)
) ré-invoquée construira correctement votre module et vous fera gagner plus de temps que vous ne pourrez jamais apprécier. (Vraiment.)
Gardez Documentation/kbuild/modules.txt
à vos côtés tout en effectuant ce travail.
Remarque: Documentation/kbuild/modules.txt
peut être disponible sur votre système Linux à l'adresse /usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt
.
Installez le paquet kernel-devel:
yum install kernel-devel
Après cela, vous devriez avoir:
/usr/src/kernels/$kernelversion/include/linux/module.h
Vous pouvez alors passer quelque chose comme:
-I/usr/src/kernels/$(uname -r)/include
au compilateur
Vous aurez peut-être besoin d'un Makefile pour compiler votre module.J'ai essayé sur mon ordinateur personnel (Ubuntu 10.04.4), je rencontre le même problème lorsque j'utilise gcc -c hello.c
, mais en utilisant un Makefile, tout ira bien.La version du noyau est 2.6 .32-54-generic