rhel8.4(커널 버전 4.18.0-305.10.2.el8_4.x86_64)의 장치 드라이버에 대해 공급업체에서 제공한 독점 테스트 코드를 컴파일하고 있습니다. 드라이버와 해당 테스트 코드는 rhel6.6에서 테스트 및 배포하기 위해 처음 릴리스되었습니다.
컴파일러는 시스템 헤더 파일에 다음 코드 줄을 포함합니다 <linux/printk.h>
.
static inline __printf(1, 2) __cold
void early_printk(const char *s, ...) { }
아래 링크에 제공된 설명에 따라 format attribute
for 함수를 선언합니다.
<linux/compiler-gcc.h>
시스템 헤더 파일에는 다음과 같은 해당 선언이 있습니다 .
#define __printf(a, b) __attribute__((format(printf, a, b)))
커널은 소스코드에 직접 포함하는 것을 금지하고 <linux/compiler-gcc.h>
있으며, 를 통해 간접적으로 포함시키는 것을 권장합니다 <linux/compiler.h>
.
이 파일은 포함된 후 <linux/printk.h>
시스템 헤더 파일에 포함되었습니다 . 독점 공급업체 코드와 함께 제공되는 헤더 파일에는 .<linux/kernel.h>
<linux/compiler.h>
<linux/kernel.h>
위의 내용을 바탕으로 컴파일러가 위 선언에서 형식 속성의 확장을 찾을 것으로 예상할 수 있습니다 <linux/printk.h>
.
static inline __printf(1, 2) __cold
void early_printk(const char *s, ...) { }
그러나 대신 컴파일러는 형식 속성을 오류로 표시합니다.
/usr/src/kernels/4.18.0-305.10.2.el8_4.x86_64/include/linux/printk.h:145:24: error: expected declaration specifiers or ‘...’ before numeric constant
static inline __printf(1, 2) __cold
다음은 내부 커널 시스템 파일 이 포함되는 순서입니다 <linux/kernel.h>
.<linux/printk.h>
#include <stdarg.h>
#include <linux/limits.h>
#include <linux/linkage.h>
#include <linux/stddef.h>
#include <linux/types.h>
#include <linux/compiler.h>
#include <linux/bitops.h>
#include <linux/log2.h>
#include <linux/typecheck.h>
#include <linux/printk.h>
나는 gcc 버전 8.4.1 20200928을 사용하고 있습니다.
어떤 아이디어라도 크게 감사하겠습니다.