2012-02-29 23 views
10

Próbuję skompilować przykład modułu jądra "cześć świat", problemy znalezione na Ubuntu 11.04, jądro 3.2.6, gcc 4.5.2 i Fedora 16, jądro 3.2.7, gcc 4.6.7.moduł kompilacja: nie znaleziono pliku asm/linkage.h

Kod:

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

skompilowany z:

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

błąd:

In file included from /usr/src/linux/include/linux/kernel.h:13:0, from /usr/src/linux/include/linux/cache.h:4, from /usr/src/linux/include/linux/time.h:7, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: file not found

potem znalazłem się w/usr/src/linux/include/nie ma folderu o nazwie "asm", ale "asm-generic"; więc zrobiłem dowiązanie 'asm' do 'ASM-generic' i skompilowany agail:

tym czasie błędu:

In file included from /usr/src/linux/include/linux/preempt.h:9:0, from /usr/src/linux/include/linux/spinlock.h:50, from /usr/src/linux/include/linux/seqlock.h:29, from /usr/src/linux/include/linux/time.h:8, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/thread_info.h:53:29: fatal error: asm/thread_info.h: file not found

Więc realizowanego myliłem, ale dlaczego? T_T

Odpowiedz

7
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 

jest właściwym sposobem budowania modułów zobaczyć kbuild documentation

I zobaczyć różnicę beetween kompilator inwokacji można

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

i analizować wyjście modułu

1

asm powinien być linkiem do rzeczywistej architektury, dla której kompilujesz, a nie do asm-generic.
Nie można skompilować ogólnego modułu jądra, który działałby na ogólnej architekturze. Musisz go skompilować do konkretnej architektury, z której będziesz korzystać. Nie mam pojęcia, dlaczego asm nie istnieje. Powinien zostać utworzony w ramach procesu konfiguracji.
Możesz uzyskać inne błędy później, jeśli konfiguracja jest niekompletna w inny sposób.

+0

mam sprawdzić foldery src jądra (3.2 lub nowszym) na 3 maszynach z Ubuntu, Fedora i gentoo, wszystkie nie zawierają folderów "asm". Więc myślę, że to nie może być błąd .. –

+2

W sprawdzonym Redhacie '/ usr/src/kernels /.../ include/asm' jest łączem do' asm-x86_64'. – ugoren

2
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 

Tutaj hello.c jest plikiem źródłowym jądra. po prostu użyj make, aby zbudować swój moduł hello.ko.

+3

Wiem, że to może zadziałać, ale dlaczego nie działa na mojej drodze? "gcc -D__KERNEL__ -I/usr/src/linux/include/-DMODULE -Wall -O2 -c hello.c -o hello.o" –

-1

kompilacji: plik asm/linkage.h nie został znaleziony

Oznacza to, że ten konkretny plik nie został znaleziony w określonym DIR, który zostanie określony, gdy użyjemy opcji -I z make.

Możemy albo odwołują że ASM-generic do ASM, jeśli wszystkie nagłówki są obecne w ASM-rodzajowego, czy możemy użyć make narzędzie.

Dodać narzędzie do wyboru w przypadku budowy modułów jądra.

Utwórz "Makefile" w roboczym DIR.

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 

Użycie opcji -C zmieni się DIR określony przed odczytem plików Makefile lub cokolwiek innego.

Aby uniknąć tego błędu, należy użyć opcji -C z DIR /lib/modules/$(shell uname -r)/build

Do tego programu będą mogli znaleźć potrzebne pliki, otrzymasz hello.ko pliku.

Można dodać do jądra moduły przez

sudo insmod hello.ko 

Podobnie można usunąć przez

sudo rmmod hello 
Powiązane problemy