linux / module.h: нет такого файла или каталога - PullRequest
16 голосов
/ 09 ноября 2011

Я новичок и пробую некоторые основы программирования ядра в Linux. Сегодня утром я открыл файл module.h в VIM и закрыл без сохранения изменений. После этого я не могу собрать ни один из моих кодов. Я получаю следующее сообщение об ошибке

[root@localhost helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[root@localhost helloworld]# 

Вот пример кода, который успешно работал до последнего дня.

#include<linux/module.h>
#include<linux/kernel.h>

int init_module(void)
{
        printk("HELLO WORLD");
        return 0;
}

void cleanup_module(void)
{
        printk("GOODBYE");
}

Я искал файл module.h, как показано ниже, и он существует

[root@localhost usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[root@localhost usr]# 

Пожалуйста, помогите мне. Я использую CentOS в виртуальной коробке.

Ответы [ 3 ]

25 голосов
/ 09 ноября 2011

Вы пытаетесь скомпилировать свой модуль с простым gcc ни с одним из окружающие рамки kbuild. Вы могли бы получить что-то, чтобы работать в в прошлом такой подход, но это больно ужасно ужасно пытаться поддерживать подходит модуль, использующий что-либо кроме pure-kbuild Makefile. Я потратил слишком много своей жизни на борьбу с kbuild, и я не хочу, чтобы то же самое случилось с вами - обнимите kbuild и позвольте ему помочь вам построить свой модуль. пожалуйста прочитайте Documentation/kbuild/modules.txt перед написанием другой строки кода.

Что вам нужно сделать, это создать Makefile для вашего модуля. Его содержание должно выглядеть так:

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := modulename.o

else
# normal makefile
    KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

endif

Я знаю, что это намного сложнее, чем большинство Makefile с которыми вы привыкли видеть, но это служит двойному назначению. Если вы просто запустите make в своем каталоге, это повторно вызвать make, чтобы использовать механизм kbuild из работающего в данный момент ядра (предполагается, что, по крайней мере, символическая ссылка от /lib/modules/.../build до правильное местоположение).

Повторно вызванная команда make ($(MAKE)) правильно соберет ваш модуль и сэкономить больше времени, чем вы можете себе представить. (На самом деле.)

Держите Documentation/kbuild/modules.txt рядом с вами, пока выполняете эту работу.

Примечание: Documentation/kbuild/modules.txt может быть доступно в вашей системе Linux на /usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt

6 голосов
/ 09 ноября 2011

Установить пакет kernel-devel:

yum install kernel-devel

После этого вы должны иметь:

/usr/src/kernels/$kernelversion/include/linux/module.h

Затем вы можете передать что-то вроде:

-I/usr/src/kernels/$(uname -r)/include

компилятору

0 голосов
/ 02 января 2014

Вам может понадобиться Makefile для компиляции вашего модуля. Я пробовал на своем персональном компьютере (Ubuntu 10.04.4), я сталкиваюсь с той же проблемой, когда использую gcc -c hello.c, но с Makefile все будет в порядке. Версия ядра 2.6.32-54-общая

...