Linux-Kernel

無法使用 KBUILD_CFLAGS_MODULE 編譯核心模組

  • March 15, 2022

我無法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聲明

引用自:https://unix.stackexchange.com/questions/694476