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