KBUILD_CFLAGS_MODULE을 사용하여 커널 모듈을 컴파일할 수 없습니다.

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

이 문제의 근본 원인이 무엇인지 아시나요?

답변1

문서에는 명확하지 않지만다음에 추가도착하다 KBUILD_CFLAGS_MODULE. 진술을 다음으로 변경하십시오.

KBUILD_CFLAGS_MODULE += "-O1" "-mcmodel=medium" # Examples

그러면 빌드가 작동할 것입니다.

빌드 실패의 근본 원인은 KBUILD_CFLAGS_MODULE초기 -DMODULE콘텐츠를 잃어버려서 엉망이 되는 것입니다.MODULE_FILE선언.

관련 정보