我正在为 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。
任何想法将不胜感激。