获取__data_start符号的地址

时间:2012-03-13 17:22:05

标签: c linux gcc x86-64

我想以编程方式获取__data_start符号的地址。对于_GLOBAL_OFFSET_TABLE_,使用extern void* _GLOBAL_OFFSET_TABLE_工作(参见示例here)。但是,相同的技术不适用于__data_start。虽然编译器编译程序很好,但程序返回的值是假的。知道如何解决这个问题。

3 个答案:

答案 0 :(得分:3)

__data_start这样的魔术符号不是指针变量,其值是您想要的地址。它是您想要的符号的地址。因此,您需要&运算符,如&__data_start

答案 1 :(得分:1)

你可以尝试

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

(它是数组的声明,而不是指针!)

并在代码中使用&__data_start

答案 2 :(得分:1)

此代码完全没有问题。

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