2012-02-29 4 views
10

Я пытаюсь скомпилировать пример модуля ядра «hello world», проблемы, найденные на ubuntu 11.04, ядро ​​3.2.6, gcc 4.5.2 и fedora 16, kernel 3.2.7, gcc 4.6.7.компиляция модуля: asm/linkage.h файл не найден

код:

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

скомпилирован с:

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

ошибка:

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

тогда я нашел в/не USR/SRC/Linux/включать/там называется папка не «asm», но «asm-generic»; поэтому я сделал мягкую ссылку «ассемблера» на «ASM-родовое», и составил agail:

это время была ошибка:

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

Так я понял, что я был неправ, но почему? T_T

ответ

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 

правильный способ построить модули см kbuild documentation

И увидеть разницу Разногласия между вашим компилятором вызова вы можете

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

И анализировать выходной сигнал

1

asm должно быть ссылкой на фактическую архитектуру, которую вы компилируете, а не asm-generic.
Вы не можете скомпилировать общий модуль ядра, который будет работать на общей архитектуре. Вы должны скомпилировать его для конкретной архитектуры, которую собираетесь использовать.

Я не знаю, почему asm не существует. Он должен быть создан как часть процесса настройки.
Возможны другие ошибки позже, если конфигурация не завершена другими способами.

+0

Я проверить ядро ​​в исходные тексты папок (3.2+) на 3-х машинах с Ubuntu, Fedora и gentoo, все они не содержат папку asm. Поэтому я думаю, что это может быть ошибкой .. –

+2

В Redhat я проверил: '/ usr/src/kernels /.../ include/asm' является ссылкой на' 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 

Здесь hello.c является вашим исходным кодом ядра. просто используйте make, чтобы создать свой модуль hello.ko.

+3

Я знаю, что это может сработать, но почему это не работает на моем пути? "gcc -D__KERNEL__ -I/usr/src/linux/include/-DMODULE -Wall -O2 -c hello.c -o hello.o" –

-1

модуль компиляции: asm/linkage.h файл не найден

Это означает, что этот конкретный файл не был найден в указанном DIR, который указывается при использовании опции -I с make.

Мы можем либо связать это asm-generic с asm, если все заголовки присутствуют в asm-generic, либо мы можем использовать make utility.

Сделать утилиту предпочтительной в случае создания модулей ядра.

Создать «Makefile» в рабочем 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 

Использование опции -C изменится DIR указанный перед чтением мейкфайлы или делать что-нибудь еще.

Таким образом, чтобы избежать этой ошибки, используйте опцию -C с DIR /lib/modules/$(shell uname -r)/build

По этой программе будут иметь возможность найти необходимые файлы, вы получите hello.ko файл.

Вы можете добавить это к модулям ядра по

sudo insmod hello.ko 

Аналогично можно удалить с помощью

sudo rmmod hello 
Смежные вопросы