什么是glibc GLRO宏?

时间:2013-10-08 22:27:10

标签: c glibc

我目前正在尝试了解glibc启动例程(__libc_start_main)如何处理Elf辅助矢量类型(auxv_t)。

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

#define GLRO(x) _##x

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

3 个答案:

答案 0 :(得分:7)

Kerrek SB的答案提供了它的功能,但不是宏的目的。所以这就是:

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

来源:http://cygwin.com/ml/libc-help/2012-03/msg00006.html

答案 1 :(得分:4)

这是一个预处理器宏。

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

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

GLRO(hello)

现在运行预处理器:

gcc -E foo.c

您将看到宏通过在给定令牌前放置下划线来创建新令牌;在我们的示例中,我们获得_hello##预处理程序运算符连接标记。

答案 2 :(得分:3)

#define GLRO(x) _##x

##是标记粘贴运算符,它连接两个操作数。

例如,a ## b会产生ab_ ## x会产生_x

例如:

GLRO(my_symbol) = 0;

会导致:

_my_symbol = 0;