如何在程序中获取_GLOBAL_OFFSET_TABLE_地址?
我想在我的程序中获取_GLOBAL_OFFSET_TABLE_的地址。 一种方法是在Linux中使用nm命令,可能将输出重定向到文件并解析该文件以获取_GLOBAL_OFFSET_TABLE_的地址。 但是,这种方法似乎效率很低。 有哪些更有效的方法呢?
这似乎有效:
#include 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_
如果使用汇编语言,则可以在不使用get_pc_thunk
情况下获取_GLOBAL_OFFSET_TABLE_
地址。
这很棘手。 🙂
以下是示例代码:
$ 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 : 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)