glibc GLRO宏是什么?

glibc GLRO宏是什么?,c,glibc,C,Glibc,我目前正试图了解glibc启动例程(_libc_start_main)如何处理Elf辅助向量类型(auxv_t) 浏览glibc的源代码,我找到了一些名为GLRO的函数的引用。在试图找到这个函数的定义时,我能找到的最接近的是 #define GLRO(x) _##x 当我搜索“##x”时,我只找到其他类似的“#define”指令,这让我感到困惑。这个定义是什么意思?“##x”是某种编译器指令吗?这是一个预处理器宏 通过运行预处理器,您可以亲自查看它的功能。只需制作一个示例文件,如下所示: //

我目前正试图了解glibc启动例程(_libc_start_main)如何处理Elf辅助向量类型(auxv_t)

浏览glibc的源代码,我找到了一些名为GLRO的函数的引用。在试图找到这个函数的定义时,我能找到的最接近的是

#define GLRO(x) _##x

当我搜索“##x”时,我只找到其他类似的“#define”指令,这让我感到困惑。这个定义是什么意思?“##x”是某种编译器指令吗?

这是一个预处理器宏

通过运行预处理器,您可以亲自查看它的功能。只需制作一个示例文件,如下所示:

// foo.c
#include <some_glibc_header.h>

GLRO(hello)
您将看到宏通过在给定标记前面加下划线来创建一个新标记;在我们的示例中,我们获得了
\u hello
##
预处理器操作符连接令牌

#define GLRO(x) _##x
##
是标记粘贴运算符,它将其两个操作数连接起来

e、 例如,
a##b
产生
ab
##x
产生
#x

例如:

GLRO(my_symbol) = 0;
将导致:

_my_symbol = 0;

Kerrek SB的回答提供了它的作用,但没有提供宏的目的。这就是:

GLRO()宏用于访问全局或本地只读数据,请参阅sysdeps/generic/ldsodefs.h


来源:

这很有道理!谢谢你的洞察力。
_my_symbol = 0;