Как я могу получить адрес _GLOBAL_OFFSET_TABLE_ в моей программе? - PullRequest
4 голосов
/ 13 марта 2012

Я хочу получить адрес _GLOBAL_OFFSET_TABLE_ в моей программе. Одним из способов является использование команды nm в Linux, возможно, перенаправить вывод в файл и проанализировать этот файл, чтобы получить адрес _GLOBAL_OFFSET_TABLE_. Однако этот метод представляется довольно неэффективным. Каковы некоторые более эффективные методы сделать это?

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Кажется, что это работает:

#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_
0 голосов
/ 04 октября 2018

Если вы используете язык ассемблера, вы можете получить _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)
...