Получить адрес символа __data_start - PullRequest
0 голосов
/ 13 марта 2012

Я хочу получить адрес символа __data_start программно. Для _GLOBAL_OFFSET_TABLE_ использование extern void* _GLOBAL_OFFSET_TABLE_ сработало (см. Пример здесь ). Однако та же самая техника не работает для __data_start. Хотя компилятор прекрасно компилирует программу, значение, возвращаемое программой, является поддельным. Любая идея, как решить эту проблему.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Магические символы, такие как __data_start, не являются переменными указателя, значение которых является адресом, который вы хотите.Это адрес символа , который вы хотите.Так что вам нужен оператор &, как в &__data_start.

1 голос
/ 13 марта 2012

Этот код работает без проблем вообще.

extern void *data_start;
int main() {
fprintf(stdout,">%p\n", &data_start);
return 0;
}

atom :: » nm test | grep "data_start" ; ./test
0804a00c D __data_start
0804a00c W data_start
>0x804a00
1 голос
/ 13 марта 2012

Вы можете попробовать

extern char _GLOBAL_OFFSET_TABLE_[];
extern char __data_start[];

(Это объявление массивов, а не указателей!)

и использовать &__data_start в своем коде.

...