我目前正試圖瞭解glibc啓動例程(__libc_start_main)如何處理Elf輔助矢量類型(auxv_t)。什麼是glibc GLRO宏?
通過瀏覽glibc的源代碼,我找到了一些名爲GLRO的函數的引用。在試圖追查定義這個功能,我能找到最接近的是
#define GLRO(x) _##x
當我搜索「## X」,所有我覺得是其他類似的「#定義」指令,這讓我困惑。這個定義是什麼意思?是「 ## x」某種編譯器指令?
我目前正試圖瞭解glibc啓動例程(__libc_start_main)如何處理Elf輔助矢量類型(auxv_t)。什麼是glibc GLRO宏?
通過瀏覽glibc的源代碼,我找到了一些名爲GLRO的函數的引用。在試圖追查定義這個功能,我能找到最接近的是
#define GLRO(x) _##x
當我搜索「## X」,所有我覺得是其他類似的「#定義」指令,這讓我困惑。這個定義是什麼意思?是「 ## x」某種編譯器指令?
這是一個預處理宏。
您可以通過運行預處理器瞭解它的功能。只是做一個樣本文件,像這樣:
// 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;
Kerrek SB的答案提供了它做什麼,而不是宏觀的目的。因此,它是:
「GLRO()宏用於訪問全局或本地只讀數據,請參閱sysdeps/generic/ldsodefs.h。」
這很有道理!感謝您的洞察力。 – rick