Подтвердить что ты не робот

Компиляция ошибок: 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.
4b9b3361

Ответ 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 не устанавливают заголовки ядра по умолчанию. Ищите пакетные заголовки ядра или что-то подобное.