寻求对 printk.h 中奇怪错误的想法

寻求对 printk.h 中奇怪错误的想法

我正在为 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 attributefor 函数

声明函数的属性

系统头文件中有相应的声明<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。

任何想法将不胜感激。

相关内容