Linux Kernel Module Programming Guideで指定されている標準のMakefileを使ってLinuxカーネルモジュールをコンパイルしようとしています。 MakefileがMakefile
と指定されていれば、すべて動作します。 Makefileの名前をMakefile.hello
などに変更すると、パスが見つからないので失敗しますMakefile
。私はこのコマンドを正しく機能させるためにMakefileに追加できるコマンドやフラグのセットがあるかどうか疑問に思っていました。私はCMakeから呼び出すので、Makefileの名前を変更する必要があります。 Cmakeは独自のMakefileを作成し、私がすでに持っているものを上書きします。異なるパス名のMakefileを使ってLinuxカーネルモジュールを構築する
カーネルモジュールのコードをhello worldの例に置き換えて、問題を再現しました。私はmakefileを知っている。
ハロー世界の例hello.c
/*
* hello−1.c − The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
Makefileの
obj-m += hello.o
ifeq (,$(KDIR))
KDIR := /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) $(KCONFIG) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
メイクファイルをMakefile
呼び出された場合。 (正常にビルド)
$> make -f Makefile
make -C /lib/modules/4.4.0-21-generic/build M=/home/msmith/Desktop/kernel-test modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-21-generic'
CC [M] /home/msmith/Desktop/kernel-test/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/msmith/Desktop/kernel-test/hello.mod.o
LD [M] /home/msmith/Desktop/kernel-test/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-21-generic'
は、メイクファイルが
$> make -f Makefile.hello
make -C /lib/modules/4.4.0-21-generic/build M=/home/msmith/Desktop/kernel-test modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-21-generic'
scripts/Makefile.build:44: /home/msmith/Desktop/kernel-test/Makefile: No such file or directory
make[2]: *** No rule to make target '/home/msmith/Desktop/kernel-test/Makefile'. Stop.
Makefile:1396: recipe for target '_module_/home/msmith/Desktop/kernel-test' failed
make[1]: *** [_module_/home/msmith/Desktop/kernel-test] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-21-generic'
Makefile.hello:10: recipe for target 'all' failed
make: *** [all] Error 2
(ビルドに失敗)Makefile.hello
呼び出された場合の出力を行いますしかし私はちょうどより多くの問題を引き起こしたこと、内部MAKEパラメータに-fを追加してみました。
私はCMakeを使って簡単にモジュールを作成することはできません。カーネルは、KBuildという独自のビルドシステムを使用しています。 https://cmake.org/pipermail/cmake/2007-November/017320.html – 0andriy