Linux-Kernel
無法使用 KBUILD_CFLAGS_MODULE 編譯核心模組
我無法
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
你知道這個問題的根本原因是什麼嗎?
從文件中看並不明顯,但您應該添加到
KBUILD_CFLAGS_MODULE
. 將您的聲明更改為KBUILD_CFLAGS_MODULE += "-O1" "-mcmodel=medium" # Examples
並且建構將起作用。
建構失敗的根本原因是
KBUILD_CFLAGS_MODULE
失去了它的初始-DMODULE
內容,從而弄亂了MODULE_FILE
聲明。