J'essaie de compiler un exemple de module de noyau "hello world", Détecté sur Ubuntu 11.04, noyau 3.2.6, gcc 4.5.2 et Fedora 16, noyau 3.2.7, gcc 4.6.7.
code:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static int __init hello_init (void)
{
printk("Hello module init\n");
return 0;
}
static void __exit hello_exit (void)
{
printk("Hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
compilé avec:
gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o
erreur:
Dans le fichier inclus dans /usr/src/linux/include/linux/kernel.h:13:0, À partir de /usr/src/linux/include/linux/cache.h:4, à partir de /usr/src/linux/include/linux/time.h:7, à partir de /usr/src/linux/include/linux/stat.h:60, à partir de/usr /src/linux/include/linux/module.h:10, de hello.c: 1: /usr/src/linux/include/linux/linkage.h:5:25: erreur fatale: asm/linkage.h: fichier non trouvé
puis j'ai trouvé dans/usr/src/linux/include/il n'y a pas de dossier nommé "asm" mais "asm-generic"; , alors j'ai créé un lien symbolique "asm" vers "asm-generic", et compilé sur:
cette fois l'erreur était:
Dans le fichier inclus à partir de /usr/src/linux/include/linux/preempt.h:9:0, À partir de /usr/src/linux/include/linux/spinlock.h:50, à partir de /usr/src/linux/include/linux/seqlock.h:29, à partir de /usr/src/linux/include/linux/time.h:8, à partir de/usr /src/linux/include/linux/stat.h:60, à partir de /usr/src/linux/include/linux/module.h:10, à partir de hello.c: 1: /usr/src/linux/include/linux/thread_info.h:53:29: erreur fatale: asm/thread_info.h: fichier non trouvé
Alors j'ai réalisé que j'avais tort, mais pourquoi? T_T
obj-m += hello.o
all:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) clean
est un bon moyen de construire des modules voir la documentation de kbuild
Et pour voir la différence entre votre invocation du compilateur, vous pouvez
cat /lib/modules/$(Shell uname -r)/build/Makefile
Et analyser une sortie
obj-m += hello.o
all:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) clean
Hello.c est votre fichier source du noyau. utilisez simplement make pour construire votre module hello.ko.
asm
devrait être un lien vers l'architecture actuelle pour laquelle vous compilez, et non vers asm-generic
.
Vous ne pouvez pas compiler un module de noyau générique, cela fonctionnerait sur une architecture générique. Vous devez le compiler pour l'architecture particulière que vous allez utiliser.
Je ne sais pas pourquoi la asm
n'existait pas. Il devrait être créé dans le cadre du processus de configuration.
Il est possible que vous obteniez d'autres erreurs ultérieurement, si la configuration est incomplète d'une autre manière.
Les asm includes (tels que linkage.h) sont spécifiques à l'architecture. Il devrait y avoir un ensemble de répertoires sous:
/usr/src/kernels/(kernel version goes here)/Arch
qui fournissent des inclusions spécifiques pour l’architecture de processeur spécifique pour laquelle vous ciblez votre code.
Essayez d'ajouter ceci à votre Makefile:
KVERSION :=R(Shell uname -r)
et ajoutez le noyau et l'architecture (x86 dans cet exemple):
INCDIRS = -I./include -I/usr/src/kernels/$(KVERSION)/include -I/usr/src/kernels/$(KVERSION)/Arch/x86