Как написать make-файл модуля ядра Linux? - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь написать простой модуль ядра hello world. Я работаю в Ubuntu 18.04.2 LTS на виртуальной коробке. В каталоге / usr / sr c я создал каталог с именем hello, а внутри этого каталога hello я создал hello. c и make-файл. Вот мой make-файл:

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

Когда я делаю команду "sudo make", я получаю такой вывод:

make -C /lib/modules/5.3.0-28-generic/build M= modules
make[1]: Entering directory '/usr/src/linux-headers-5.3.0-28-generic'
make[2]: *** No rule to make target 'arch/x89/tools/relocs_32.c', needed by 'arch/x86/tools/relocs_32.o'. Stop.
arch/x86/Makefile:232: recipe for target 'archscripts' failed
make[1]: *** [archscripts] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.3.0-28-generic'
makefile:4: recipe for target 'all' failed
make: *** [all] Error 2

Я пробовал несколько вариантов моего make-файла, включая изменение " PWD "для" оболочки PWD ". Насколько я знаю, я установил все необходимые инструменты и библиотеки. В чем может быть проблема здесь?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Переменная PWD устанавливается оболочкой , поэтому ваш Makefile полагается на make вызов, выполняемый из оболочки, как мы обычно делаем, когда набираем make в терминале.

Но sudo make выполняет make из простой пользовательской среды. В этой среде отсутствует для переменной PWD, поэтому ваш Makefile ведет себя некорректно. Это может быть найдено из вашего вывода:

make -C /lib/modules/5.3.0-28-generic/build M= modules

Используйте взамен $(shell pwd) выражение, это более надежно:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

В качестве альтернативы, вы можете позвонить make с root привилегии, использующие этот способ:

sudo /bin/sh -c make

Таким образом, make выполняется не из простой среды root, а в промежуточной оболочке. Эта оболочка устанавливает переменную PWD.

Обновление

Как отметил @Ian Abbott в комментариях, еще одна альтернатива для $(PWD) - $(CURDIR). Переменная CURDIR устанавливается самой make (точнее, GNU Make). См. Также этот вопрос: bash: В чем разница между PWD и CURDIR? .

0 голосов
/ 17 февраля 2020

Ваш Makefile должен выглядеть следующим образом

obj-m += hello.o

Тогда ваша команда сборки будет выглядеть так:

make -C $KDIR M=$PWD

Где $ KDIR исходное дерево вашей сборки ядра.

- путь. Все остальное обрабатывается системой kbuild.

Пожалуйста, обратитесь к официальной документации для построения модулей вне дерева

...