如何在程序中获取_GLOBAL_OFFSET_TABLE_地址?

时间:2012-03-13 15:11:15

标签: c linux gcc x86-64

我想在程序中获取_GLOBAL_OFFSET_TABLE_的地址。一种方法是在Linux中使用nm命令,可能将输出重定向到文件并解析该文件以获取_GLOBAL_OFFSET_TABLE_的地址。但是,这种方法似乎效率很低。有哪些更有效的方法呢?

2 个答案:

答案 0 :(得分:1)

这似乎有效:

#include <stdio.h>

extern void *_GLOBAL_OFFSET_TABLE_;

int main()
{
    printf("_GLOBAL_OFFSET_TABLE = %p\n", &_GLOBAL_OFFSET_TABLE_);
    return 0;
}

它给出了:

$ ./test
_GLOBAL_OFFSET_TABLE = 0x6006d0

然而,nm认为不同:

$ nm test | fgrep GLOBAL
0000000000600868 d _GLOBAL_OFFSET_TABLE_

答案 1 :(得分:0)

如果使用汇编语言,则可以获得_GLOBAL_OFFSET_TABLE_的地址而没有get_pc_thunk
这是棘手的方式。 :)


这是示例代码:

$ cat test.s

.global main
main:
 lea HEREIS, %eax   # Now %eax holds address of _GLOBAL_OFFSET_TABLE_      

.section .got
HEREIS:

$ gcc -o test test.s

之所以可用,是因为.got部分与<.got.plt>相邻
因此,符号HEREIS_GLOBAL_OFFSET_TABLE_位于同一地址。


PS。您可以检查它是否与objdump一起使用。

Disassembly of section .got:

080495e8 <HEREIS-0x4>:
 80495e8:   00 00                   add    %al,(%eax)
    ...

Disassembly of section .got.plt:

080495ec <_GLOBAL_OFFSET_TABLE_>:
 80495ec:   00 95 04 08 00 00       add    %dl,0x804(%ebp)
 80495f2:   00 00                   add    %al,(%eax)
 80495f4:   00 00                   add    %al,(%eax)