如何在程序中获取_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)