6

現在、glibc スタートアップ ルーチン (__libc_start_main) が Elf 補助ベクトル型 (auxv_t) を処理する方法を理解しようとしています。

glibc のソース コードを参照すると、GLRO という名前の関数への参照が見つかります。この関数の定義を追跡しようとすると、私が見つけることができる最も近いものは

#define GLRO(x) _##x

" ##x" を検索すると、他の同様の "#define" ディレクティブしか見つからず、混乱してしまいます。この定義はどういう意味ですか? 「 ##x」はある種のコンパイラ指令ですか?

4

3 に答える 3

8

Kerrek SB の回答は、それが何をするかを提供しますが、マクロの目的は提供しません。だからここにあります:

「GLRO() マクロは、グローバルまたはローカルの読み取り専用データにアクセスするために使用されます。sysdeps/generic/ldsodefs.h を参照してください。」

ソース: http://cygwin.com/ml/libc-help/2012-03/msg00006.html

于 2013-11-02T02:58:24.297 に答える
5

これはプリプロセッサ マクロです。

プリプロセッサを実行することで、それが何をするかを自分で確認できます。次のように、サンプル ファイルを作成します。

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

GLRO(hello)

プリプロセッサを実行します。

gcc -E foo.c

マクロは、指定されたトークンの前にアンダースコアを付けて新しいトークンを作成することがわかります。この例では、 を取得し_helloます。プリプロセッサ オペレータは##トークンを連結します。

于 2013-10-08T22:44:31.200 に答える
3
#define GLRO(x) _##x

##はトークン貼り付け演算子で、2 つのオペランドを連結します。

例: a ## byieldsab_ ## xyields _x

たとえば、次のようになります。

GLRO(my_symbol) = 0;

次のようになります。

_my_symbol = 0;
于 2013-10-08T22:45:22.283 に答える