Я хочу получить адрес символа __data_start программно. Для _GLOBAL_OFFSET_TABLE_ использование extern void* _GLOBAL_OFFSET_TABLE_ сработало (см. Пример здесь ). Однако та же самая техника не работает для __data_start. Хотя компилятор прекрасно компилирует программу, значение, возвращаемое программой, является поддельным. Любая идея, как решить эту проблему.
__data_start
extern void* _GLOBAL_OFFSET_TABLE_
Магические символы, такие как __data_start, не являются переменными указателя, значение которых является адресом, который вы хотите.Это адрес символа , который вы хотите.Так что вам нужен оператор &, как в &__data_start.
&
&__data_start
Этот код работает без проблем вообще.
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
Вы можете попробовать
extern char _GLOBAL_OFFSET_TABLE_[]; extern char __data_start[];
(Это объявление массивов, а не указателей!)
и использовать &__data_start в своем коде.