ядро Linux.ч: нет такого файла или каталога
Я собираюсь написать модуль Hello World в Ubuntu 10.10 (с ядром 2.6.35-28-generic). Заголовки расположены:
/usr/src/linux-headers-2.6.35-28-generic
Здравствуйте.c:
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, worldn");
return 0;
}
void cleanup_module(void)
{
printk("Goodbyen");
}
и Makefile:
CC = gcc
CFLAGS = -Wall -DMODULE -D__KERNEL__
hello.o: hello.c
$(CC) $(CFLAGS) -c hello.c
echo insmod hello.o to install
echo rmmod to delete
ошибка сделать:
Здравствуйте.c: 1: фатальная ошибка: linux/kernel.ч : нет такого файла или каталога компиляция завершена.
как мне решить эту проблему?
4 ответов
у вас есть символическая ссылка /usr/src/linux на ваши/usr/src / linux-заголовки-2.6.35-28-Общий ? Если нет, то создайте его, используя следующие команды
# cd /usr/src
# ln -sfn linux-headers-2.6.35-28-generic linux
вы не можете просто использовать традиционном стиле Makefile
с модулями ядра Linux; в то время как вы может сможет заставить что-то работать, это будет болезненный опыт.
начните с чтения Documentation/kbuild/modules.txt
файл; он будет точно описывать, что вам нужно сделать при написании модуля Makefile
чтобы он мог аккуратно зацепиться за ядро Kbuild
окружающая среда. Ваш Makefile
вероятно, будет выглядеть примерно так:
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
# Module specific targets
genbin:
echo "X" > 8123_bin.o_shipped
endif
пожалуйста, поверьте мне; а вы можете подумать, что вы "всего лишь одно небольшое изменение" от получения собственного Makefile
чтобы работать, даже незначительные изменения в версии ядра полностью уничтожат вашу сборку снова и снова. Просто возьмите час сейчас, чтобы написать Kbuild
-совместимый Makefile
для вашего модуля. Я потратил недели своей жизни, пытаясь сохранить ранее существовавшее Makefile
когда Kbuild
была введена инфраструктура. Каждое новое ядро заставляло меня терять часа производительности.
Так же , как сказал @sarnold, вы должны использовать другой файл Makefile.Так же, как следующее:
obj-m += Здравствуйте.o
все: make-C / lib / modules / $(shell uname-r) / build M=$(PWD) modules
и с помощью команды:
insmod Здравствуйте.ко
для установки этого модуля.