Компиляция ошибок: linux/module.h: нет такого файла или каталога
Я написал простой модуль:
#define __KERNEL__
#define MODULE
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, world\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye\n");
}
и скомпилировать его с помощью этой команды:
cc -c hello.c
но я получаю эту ошибку:
linux/module.h: No such file or directory
любые предложения?
EDIT:
Я использовал это commad:
cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c
и он идет на один шаг вперед, теперь я получаю эту ошибку:
In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0,
from hello.c:3:
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
Ответы
Ответ 1
Прежде всего вам нужны источники ядра. Многие путают заголовки пользовательского пространства и заголовки пространства ядра, потому что многие из них имеют одну и ту же структуру папок. Большинство дистрибутивов имеют только заголовки пользовательского пространства, а не пространства ядра.
И вообще make
используется для сборки модуля ядра, а не для голого cc
. Выполните простой шаг за шагом объясненный модуль ядра Hello World
, указанный здесь
Ответ 2
Исходное имя файла basic.c
#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
=====================================
теперь создайте файл для ubuntu
В начале типа на ур-терминале, что $(uname -r), то u получит версию.
который использует систему ur
obj-m +=basic.o
KDIR =//usr/src/linux-headers-3.13.0-44-generic
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order
=============================================== =
Для запуска кода
$sudo insmod basic.ko
$dmesg
u will get the output
$sudo rmmod basic.ko
$dmesg
Ответ 3
Вам нужны заголовки ядра; они обычно находятся в /usr/include/
, если они установлены.
Если вы не используете дистрибутив с исходным кодом или не создаете собственное ядро, шансы хорошие, они не установлены по умолчанию; используйте диспетчер дистрибутивов для их установки. Пакет часто называют linux-headers
.
Ответ 4
Вам нужна среда сборки ядра (выбор скриптов, заголовок и Makefiles), обычно это достигается через /lib/modules/version/build (символическая ссылка на него), если ядро уже установлено. В противном случае каталог представляет собой каталог сборки (тот, где находится System.map). Полные источники не нужны (умные дистрибутивы распознают это), и ни одно из них /usr/include/whatever.
Вы также должны использовать kbuild; вызов cc -I
недостаточен и не был более 10 лет. Вы начинаете с файла Kbuild
:
obj-m += mymodule.o
и a Makefile
:
kdir=/lib/modules/$(shell uname -r)/build
all:
make -C ${kdir} M=$$PWD
modules_install clean:
make -C ${kdir} M=$$PWD [email protected]
а затем используйте make
.
#defining __KERNEL__
и MODULE
также бессмысленно, потому что это уже задано kbuild, если это необходимо.
Ответ 5
Большинство дистрибутивов Linux не устанавливают заголовки ядра по умолчанию. Ищите пакетные заголовки ядра или что-то подобное.