2013-10-08 44 views
4

我目前正試圖瞭解glibc啓動例程(__libc_start_main)如何處理Elf輔助矢量類型(auxv_t)。什麼是glibc GLRO宏?

通過瀏覽glibc的源代碼,我找到了一些名爲GLRO的函數的引用。在試圖追查定義這個功能,我能找到最接近的是

#define GLRO(x) _##x 

當我搜索「## X」,所有我覺得是其他類似的「#定義」指令,這讓我困惑。這個定義是什麼意思?是「 ## x」某種編譯器指令?

回答

3

這是一個預處理宏。

您可以通過運行預處理器瞭解它的功能。只是做一個樣本文件,像這樣:

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

GLRO(hello) 

現在運行預處理:

gcc -E foo.c 

你會看到,宏創建通過把下劃線在給定的令牌前的新令牌;在我們的例子中,我們獲得_hello##預處理器運算符連接令牌。

+0

這很有道理!感謝您的洞察力。 – rick

3
#define GLRO(x) _##x 

##是標記粘貼操作,它會將其兩個操作數。

例如,a ## b產生ab_ ## x產生_x

因此,例如:

GLRO(my_symbol) = 0; 

會導致:

_my_symbol = 0;