linux - MODULE_DESCRIPTION 作为运行时生成的字符串

标签 linux module kernel

是否可以将 Linux 内核模块中的 MODULE_DESCRIPTION 设置为运行时生成的字符串,或者它是否必须预先定义,例如 #define 或 ""?

尝试将其设置为运行时生成的字符串时出现此错误:

 error: expected ‘,’ or ‘;’ before ‘desc’
 MODULE_DESCRIPTION(desc);
                    ^
include/linux/moduleparam.h:23:26: note: in definition of macro ‘__MODULE_INFO’
   = __stringify(tag) "=" info
                          ^
include/linux/module.h:133:42: note: in expansion of macro ‘MODULE_INFO’
 #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
                                          ^
 note: in expansion of macro ‘MODULE_DESCRIPTION’
 MODULE_DESCRIPTION(desc);
 ^

谢谢!

最佳答案

如果您查看 moduleparam.h 中的整个宏,您会得到以下内容:

#define __MODULE_INFO(tag, name, info)                                  \
static const char __UNIQUE_ID(name)[]                                   \
  __used __attribute__((section(".modinfo"), unused, aligned(1)))       \
  = __stringify(tag) "=" info

如果你去掉 __attribute__ 你会得到类似的东西

#define __MODULE_INFO(tag, name, info)                                  \
static const char __UNIQUE_ID(name)[]                                   \
  = __stringify(tag) "=" info

请注意这一行 __stringify(tag) "="info 正在创建一个依赖于 C 预处理器连接字符串这一事实的字符串。

因此它不能是运行时生成的字符串,它必须是 C 预处理器可以解释和连接的东西。

关于linux - MODULE_DESCRIPTION 作为运行时生成的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31141989/

相关文章:

linux - 在linux中使用vim时权限被拒绝

javascript - HTML/Javascript 模块

perl - 从变量内容实例化模块

linux - 无法理解为什么不应该使用/usr/src/linux 进行内核开发

linux - Yocto - 添加自定义驱动程序

c - 什么可能导致死循环,由 linux 内核中的 print "Dead loop on virtual device "指示?

linux - 使用 Automake 更正 GCC 命令行顺序

regex - 在 N 个字符后最接近的逗号处拆分一个长字符串并循环每个字符串

linux - 使用自定义 header 编译 Linux 内核模块

linux - 如何使用 ~ 作为分隔符使用 sed 查找和替换文本