it-swarm.com.de

kompilieren des Moduls: Die Datei asm/linkage.h wurde nicht gefunden

Ich versuche, ein Beispiel für das Kernel-Modul "Hallo Welt" zu kompilieren, Probleme, die auf Ubuntu 11.04, Kernel 3.2.6, GCC 4.5.2 und Fedora 16, Kernel 3.2.7, GCC 4.6.7 gefunden wurden.

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);

zusammengestellt mit:

gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o

error:

In der Datei enthalten aus /usr/src/linux/include/linux/kernel.h:13:0, aus /usr/src/linux/include/linux/cache.h:4, aus/usr/src/linux/include /linux/time.h:7, von /usr/src/linux/include/linux/stat.h:60, von /usr/src/linux/include/linux/module.h:10, von hello.c: 1: /usr/src/linux/include/linux/linkage.h:5:25: Schwerwiegender Fehler: asm/linkage.h: Datei nicht gefunden

dann fand ich in/usr/src/linux/include/keinen Ordner namens 'asm' sondern 'asm-generic'; Also habe ich einen Softlink 'asm' zu 'asm-generic' erstellt und agail kompiliert:

diesmal war der fehler:

In der Datei enthalten aus /usr/src/linux/include/linux/preempt.h:9:0, aus /usr/src/linux/include/linux/spinlock.h:50, aus/usr/src/linux/include /linux/seqlock.h:29, aus /usr/src/linux/include/linux/time.h:8, aus /usr/src/linux/include/linux/stat.h:60, aus/usr/src /linux/include/linux/module.h:10, from hello.c: 1: /usr/src/linux/include/linux/thread_info.h:53:29: Schwerwiegender Fehler: asm/thread_info.h: Datei nicht gefunden

Also wurde mir klar, dass ich falsch lag, aber warum? 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

ist ein geeigneter Weg, um Module zu erstellen. Siehe kbuild documentation

Und um den Unterschied zwischen Ihrem Compiler-Aufruf zu sehen, könnten Sie

cat /lib/modules/$(Shell uname -r)/build/Makefile

Und eine Ausgabe analysieren

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

Hier ist hello.c Ihre Kernel-Quelldatei. Verwenden Sie einfach make, um Ihr hallo.ko-Modul zu erstellen.

3
Barun Parichha

asm sollte eine Verknüpfung zu der Architektur sein, für die Sie kompilieren, nicht zu asm-generic.
Sie können kein generisches Kernelmodul kompilieren, das auf einer generischen Architektur funktionieren würde. Sie müssen es für die bestimmte Architektur kompilieren, die Sie verwenden möchten.

Ich weiß nicht, warum die asm nicht existiert hat. Es sollte als Teil des Konfigurationsprozesses erstellt werden.
Andere Fehler können später auftreten, wenn die Konfiguration auf andere Weise unvollständig ist.

1
ugoren

Die asm Includes (wie linkage.h) sind architekturspezifisch. Es sollte eine Reihe von Verzeichnissen geben unter:

    /usr/src/kernels/(kernel version goes here)/Arch

diese bieten spezifische Includes für die spezifische CPU-Architektur, für die Sie den Code kompilieren möchten.

Versuchen Sie dies zu Ihrem Makefile hinzuzufügen:

    KVERSION :=R(Shell uname -r)

fügen Sie den Kernel und die Architektur hinzu (in diesem Beispiel x86):

    INCDIRS = -I./include -I/usr/src/kernels/$(KVERSION)/include -I/usr/src/kernels/$(KVERSION)/Arch/x86
0
Jay Elston