web-dev-qa-db-fra.com

linux/module.h: Aucun fichier ou répertoire de ce type

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.

14
ajishalfred

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 Makefiles 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.

25
sarnold

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

6
duncan

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

0
njuzwr