【问题标题】:Get the address of __data_start symbol获取 __data_start 符号的地址
【发布时间】:2012-03-13 17:22:04
【问题描述】:

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

【问题讨论】:

  • 没用;请参阅我对您的其他问题的评论。并将__data_start 更改为&__data_start
  • @R.. 太好了!它的作品现在!谢谢!也许你可以把这个作为答案,所以我可以接受。

标签: c linux gcc x86-64


【解决方案1】:

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

【讨论】:

  • __data_start 在哪里定义?与etext 不同,它不在ld -verbose 给出的链接描述文件中。但它绝对是定义它的链接器,因为它出现在ld 的源代码上。安装的其他一些链接器脚本定义了__data_start__,但没有定义__data_start
  • 其实我也不知道。您必须检查链接器源才能弄清楚,或者请教 GNU ld 专家。
  • 当然,以防万一:-)如果我发现我会回帖。
【解决方案2】:

你可以试试

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

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

并在您的代码中使用&__data_start

【讨论】:

  • 在这种情况下,& 不是必需的,因为数组的名称计算为指向其第一个元素的指针。
  • & 在声明为不完整类型(未知大小)的数组上是否有效?通常& 的类型应用于T[N] 类型的数组是T(*)[N] 类型,但这里没有N...
  • 是的,当然取未指定维度数组的地址是有效的。
【解决方案3】:

此代码完全没有问题。

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

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 2021-06-13
    • 1970-01-01
    • 2018-08-05
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多