我目前正在尝试了解 glibc 启动例程(__libc_start_main)如何处理 Elf 辅助向量类型(auxv_t)。
浏览 glibc 的源代码,我发现对一些名为 GLRO 的函数的引用。在试图追踪这个函数的定义时,我能找到的最接近的是
#define GLRO(x) _##x
当我搜索“ ##x”时,我发现的只是其他类似的“#define”指令,这让我感到困惑。这个定义是什么意思?“ ##x”是某种编译器指令吗?
Kerrek SB 的答案提供了它的作用,但没有提供宏的用途。所以这里是:
“GLRO() 宏用于访问全局或本地只读数据,请参阅 sysdeps/generic/ldsodefs.h。”
这是一个预处理器宏。
您可以通过运行预处理器亲自了解它的作用。只需制作一个示例文件,如下所示:
// foo.c
#include <some_glibc_header.h>
GLRO(hello)
现在运行预处理器:
gcc -E foo.c
您将看到宏通过在给定标记前添加下划线来创建新标记;在我们的示例中,我们获得_hello
. 预##
处理器运算符连接标记。
#define GLRO(x) _##x
##
是令牌粘贴运算符,它连接两个操作数。
例如,a ## b
产量ab
和_ ## x
产量_x
。
例如:
GLRO(my_symbol) = 0;
会导致:
_my_symbol = 0;