LINUX.ORG.RU

Ошибка при компиляции своего модуля ядра


0

0

Привет всем! Прошу помощи...

Начинаю разбираться с программированием модулей ядра, решил запустить первый модуль "Hello, world", все как по учебнику. Под это дело скачал и установил новое ядро 2.6.20, т.е. исходники есть и ядро по ним компилируется и устанавливается. Написал свой модуль, файлик называется, например, hello.c и создал Makefile такого содержания:

> obj_m += hello.o

Запускаю на компиляцию (из папки, где лежит исходник) вот так:

> make -C /usr/src/linux-2.6.20/ M=`pwd` modules

где /usr/src/linux-2.6.20/ - это директория, где лежат исходники установленного ядра. На выводе получаю вот это:

> linux:/home/andrey/WORK/modules/hello_mod # make -C /usr/src/linux-2.6.20/ M=`pwd` modules > make: Entering directory `/usr/src/linux-2.6.20' > make -C /home/andrey/sources/kernel/2.6.20/linux-2.6.20 O=/usr/src/linux-2.6.20 modules > Building modules, stage 2. > MODPOST 0 modules > make: Leaving directory `/usr/src/linux-2.6.20'

И ничего похожего на [CC] /чего_то_там/hello.o [LD] /чего_то_там/hello.mod.ko, как по идее должно быть, и при этом ничего не создается, никакие модули не появляются.

Т.е., если я правильно понимаю, почему-то не запускается сама компиляция...

В чем может быть проблема?

вот пример простого мейкфайла:

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

asgard
()
Ответ на: комментарий от asgard

> вот пример простого мейкфайла

Спасибо огромное, этот мекфайл заработал!

Тогда вопрос такой: а в чем же его принципиальное отличие от моего такого мейка, который не работает -

> obj_m := hello_mod.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 -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

с явным указанием всех директорий (кроме M=`pwd` :) ) и мейком из одной строки obj_m := hello_mod.o - тоже не работает?

Iceman82
() автор топика
Ответ на: комментарий от Iceman82

LDD3, глава 2, "Compiling modules". Если вкратце - make при сборке вызывается дважды, и срабатывают секции в разных ветвях if

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> LDD3, глава 2, "Compiling modules". Если вкратце - make при сборке вызывается дважды, и срабатывают секции в разных ветвях if

Это как раз понятно, но там же и написано, что этот вариант - для удобства в дальнейшем, а в принципе, должен срабатывать и самый простой мейкфайл из одной строки, а также запуск на компиляцию из командной строки... Добавлю также, что на другой машине, точно с таким же Линуксом и новой версией ядра, именно этот способ (описанный мною выше) работает нормально, все компилится и запускается. Что это, баг такой или фича?

Iceman82
() автор топика
Ответ на: комментарий от Iceman82

> Что это, баг такой или фича?

Скорее, "undefined behaviour". Если хочешь разобраться - пускай make с отладочными ключами и разбирайся.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ок, в любом случае - спасибо за помощь

Iceman82
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.