2013-10-08 3 views
4

В настоящее время я пытаюсь понять, как процедуры запуска glibc (__libc_start_main) обрабатывают вспомогательные векторные типы Elf (auxv_t).Что такое glibc GLRO macro?

Просматривая исходный код glibc, я нахожу ссылки на некоторую функцию с именем GLRO. Пытаясь разыскать определение этой функции, ближайший я могу найти

#define GLRO(x) _##x 

Когда я искать «## х», все я нахожу другой подобной «#define» директива, которая оставляет меня смущенный. Что означает это определение? Is " ## 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; 
5

Kerrek SB обеспечивает то, что она делает, но не цели макроса. Итак, вот оно:

«Макрос GLRO() используется для доступа к глобальным или локальным данным только для чтения, см. Sysdeps/generic/ldsodefs.h."

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

Смежные вопросы