iw 中的不熟悉代码

iw 中的不熟悉代码

最近,我正在尝试了解 iw 中的代码如何工作。在 iw.h 中,我遇到了以下问题:

#define __COMMAND(sect, name, args, nlcmd, flags, idby, handler)    \
static const struct cmd __cmd_ ## handler ## nlcmd ## idby  \
__attribute__((used)) __attribute__((section("__cmd")))     \
= { sect, name, args, nlcmd, flags, idby, handler }
#define COMMAND(section, name, args, cmd, flags, idby, handler) \
__COMMAND(#section, #name, args, cmd, flags, idby, handler)
#define TOPLEVEL(name, args, cmd, flags, idby, handler)     \
__COMMAND(NULL, #name, args, cmd, flags, idby, handler)

extern struct cmd __start___cmd;
extern struct cmd __stop___cmd;

我在 Google 上搜索了一下,但只能理解为“__start___cmd”和“__stop___cmd”是由链接器生成的。有没有更通俗易懂的解释?

定义的 __COMMAND 在代码中没有使用,我不知道它有什么用途。我只能假设它与定义的 extern struct 有关。

我从https://www.kernel.org/pub/software/network/iw/iw-0.9.1.tar.gz

答案1

这个宏定义中有趣的是使用变量属性

#define __COMMAND(sect, name, args, nlcmd, flags, idby, handler)    \
static const struct cmd __cmd_ ## handler ## nlcmd ## idby  \
__attribute__((used)) __attribute__((section("__cmd")))     \
= { sect, name, args, nlcmd, flags, idby, handler }

gccld而是)生成两个魔法变量:__start_SECTION 和 __stop_SECTION。它们可用于检索某个部分的起始和结束地址。

来源

相关内容