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