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