web-dev-qa-db-fra.com

module de compilation: fichier asm/linkage.h non trouvé

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

12
Raiden Awkward
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

9
2r2w
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.

3
Barun Parichha

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.

1
ugoren

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
0
Jay Elston