
KBUILD_CFLAGS_MODULE
新しいカーネルでカーネルモジュールをコンパイルするのに問題があります。コンパイラは私に奇妙なエラーを示しています。このタイプのビルドは以前のカーネル(5.5)で動作しましたが、5.16カーネルでは機能しなくなりました。
以下は、再現可能な最小限の例です。
仮想モジュール:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int __init lkm_example_init(void) {return 0;}
static void __exit lkm_example_exit(void){}
module_init(lkm_example_init);
module_exit(lkm_example_exit);
ファイル生成:
TARGET ?= test
obj-m += ${TARGET}.o
KBUILD_CFLAGS_MODULE := "-O1" "-mcmodel=medium" # Examples
.PHONY: all
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
その行をコメントアウトすると、KBUILD_CFLAGS_MODULE
ビルドが機能します。
ただし、コメントアウトを削除すると、次のエラーメッセージでコンパイルが失敗します。
make TARGET=test
make -C /lib/modules/5.16.0/build M=/home/user/test modules
make[1]: Entering directory '/home/user/linux'
CC [M] /home/user/test/test.o
In file included from ./include/linux/module.h:22,
from /home/user/test/test.c:2:
./include/linux/module.h:183:39: error: expected ',' or ';' before 'KBUILD_MODFILE'
183 | #define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE);
| ^~~~~~~~~~~~~~
./include/linux/moduleparam.h:26:47: note: in definition of macro '__MODULE_INFO'
26 | = __MODULE_INFO_PREFIX __stringify(tag) "=" info
| ^~~~
./include/linux/module.h:183:21: note: in expansion of macro 'MODULE_INFO'
183 | #define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE);
| ^~~~~~~~~~~
./include/linux/module.h:230:34: note: in expansion of macro 'MODULE_FILE'
230 | #define MODULE_LICENSE(_license) MODULE_FILE MODULE_INFO(license, _license)
| ^~~~~~~~~~~
/home/user/test/test.c:4:1: note: in expansion of macro 'MODULE_LICENSE'
4 | MODULE_LICENSE("GPL");
| ^~~~~~~~~~~~~~
make[2]: *** [scripts/Makefile.build:287: /home/user/test/test.o] Error 1
make[1]: *** [Makefile:1846: /home/user/test] Error 2
make[1]: Leaving directory '/home/user/linux'
make: *** [Makefile:6: all] Error 2
この問題の根本原因が何であるかを知っていますか?
答え1
文書には明確ではありませんが、次へ追加到着するKBUILD_CFLAGS_MODULE
。ステートメントを次に変更します。
KBUILD_CFLAGS_MODULE += "-O1" "-mcmodel=medium" # Examples
これでビルドが機能します。
ビルド失敗の根本原因は、KBUILD_CFLAGS_MODULE
初期-DMODULE
コンテンツを失って混乱することです。MODULE_FILE
宣言。