Ubuntu 15.10 (ядро 4.2): ошибка makefile модуля ядра Hello world

Я часами пытался создать свой первый модуль Hello World Kernel, но, увы, безуспешно. Мой простой код C (hello.c) и makefile находятся в папке /Downloads моей системы, если это имеет какое-то значение.

Привет

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

makefile

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

И это сообщение об ошибке, которое я получаю, когда пытаюсь собрать модуль ядра, введя «make» (без кавычек) в терминале:

make -C /lib/modules/4.2.0-16-generic/build
M=/home/username/workspace/test/Module modules make[1]:
Entering directory '/usr/src/linux-headers-4.2.0-16-generic'
scripts/Makefile.build:44:
/home/username/workspace/test/Module/Makefile: No such file or
directory make[2]: *** No rule to make target
'/home/username/workspace/test/Module/Makefile'.  Stop.
Makefile:1398: recipe for target
'_module_/home/username/workspace/test/Module' failed make[1]:
*** [_module_/home/username/workspace/test/Module] Error 2 make[1]: Leaving directory '/usr/src/linux-headers-4.2.0-16-generic'
makefile:4: recipe for target 'all' failed make: *** [all] Error 2

Я перепробовал почти каждое решение и следовал каждому предложению по этой проблеме, которое можно найти в Google. Ничто не могло решить мою проблему ... Если кто-нибудь знает что-нибудь, что я мог бы попробовать, я был бы очень благодарен!

  • Должен ли я переместить свой hello.c и makefile в /usr/src?
  • Есть ли синтаксические ошибки в моих файлах?
  • Должен ли он говорить hello.c вместо hello.o в make-файле?
  • Может, в моем Ubuntu чего-то не хватает?
  • ...

person ci7i2en4    schedule 28.10.2015    source источник
comment
Прочтите драйверы устройств Linux, 3-е издание. Отличная книга, в которой также подробно описан процесс строительства. Скоро будет 4 выпуск!   -  person cadaniluk    schedule 28.10.2015
comment
Я прочитал первые несколько разделов, но получение основного ядра (я пробовал 4.3) и установка его вместе с существующим ядром, как подсказывает инструкция, также не решили мою проблему. После всех исследований, которые я провел сегодня, я считаю, что ошибка как-то связана с make-файлом...   -  person ci7i2en4    schedule 28.10.2015
comment
У меня работает нормально, за исключением того, что файл .ko не создается.   -  person cadaniluk    schedule 28.10.2015
comment
Предполагается, что он работает нормально, поскольку я скопировал коды из книги, которую вы упомянули. Если это работает для вас, что-то в вашей системе должно быть другим...   -  person ci7i2en4    schedule 28.10.2015
comment
Является ли имя пользователя действительно вашим именем пользователя? Или подменили настоящий ради (не)раскрытия информации?   -  person cadaniluk    schedule 28.10.2015
comment
Ради попытки я снова установил основное ядро ​​​​4.3rc7, и теперь make выдает следующие ошибки: make -C /lib/modules/4.3.0-040300rc7-generic/build M=/home/username/workspace/test/ Модули модулей make[1]: Вход в каталог '/usr/src/linux-headers-4.3.0-040300rc7-generic' make[1]: Makefile: Нет такого файла или каталога make[1]: *** Нет правила для сделать целевой 'Makefile'. Останавливаться. make[1]: выход из каталога '/usr/src/linux-headers-4.3.0-040300rc7-generic' makefile:4: рецепт для цели 'all' не выполнен make: *** [all] Error 2   -  person ci7i2en4    schedule 28.10.2015


Ответы (1)


Я только что изменил имя "makefile" на "Makefile" (верхний регистр M), и это, кажется, что-то сделало. Теперь я получаю:

make -C /lib/modules/4.2.0-16-generic/build M=/home/username/workspace/test/Module modules make[1]: Вход в каталог '/usr/src/linux-headers-4.2.0 -16-generic' Сборка модулей, этап 2. Модули MODPOST 0 make[1]: Выход из каталога '/usr/src/linux-headers-4.2.0-16-generic'

^^ Я с самого начала знал, что каким-то образом мой make-файл вызывает эту проблему! Как бы то ни было, у меня до сих пор нет файла hello.ko.

Любые предложения, что я должен попробовать сейчас?

МОЙ БОГ !!!

Погуглил эту новую проблему и нашел этот ответ от dsf: Linux: modpost ничего не создает (последнее сообщение)

Так же, как они предлагают, я набрал текст в Makefile вручную, и после этого, как по волшебству, все заработало отлично! Теперь у меня есть свой hello.ko, но, к сожалению, без объяснений. Может быть, если вы просто скопируете текст Makefile с pdf/веб-сайта, вы получите нежелательные символы, как полагает dsf?!

В любом случае, проблема решена.

person ci7i2en4    schedule 28.10.2015
comment
Makefiles требуют символы табуляции? - person Theo Belaire; 19.03.2016