Могу ли я получить имя символа по "ПОЛУЧЕННЫЙ адрес"? - PullRequest
0 голосов
/ 01 октября 2018

Сейчас я занимаюсь разработкой программы типа readelf с использованием pyelftools библиотек.

Я хочу напечатать таблицу, как показано ниже.
Здесь, Offset поле - это stderr@GOT адрес.

jiwon@jiwon$ readelf -a --wide libstdbuf.so
...
Relocation section '.rel.dyn' at offset 0x454 contains 12 entries:
 Offset     Info    Type                Sym. Value  Symbol's Name
00001c50  00000206 R_386_GLOB_DAT         00000000   stderr@GLIBC_2.0
...


Предположим, что у меня есть только GOT-адрес (00001c50) неизвестного символа.

Моя ситуация Я хочу сделать функцию вроде get_symname_by_GOTaddress для разрешения от 00001c50 до stderr@GLIBC_2.0.

Вопрос: Однако я не смог найти никакой информации о связи между GOT address и symbol name в двоичном виде.Как я могу получить это?

1 Ответ

0 голосов
/ 02 октября 2018

Каждая запись в разделе .rel.dyn имеет как минимум следующие поля:

r_offset;
r_info;

Поэтому сначала просканируйте раздел, пока адрес не совпадет с полем r_offset записи, затем поле r_info содержит (также) индекс к таблице символов, который составлен в соответствии с этим:

/* for 32bit */
#define ELF32_R_INFO(sym, type)       (((sym)<<8)+(unsigned char)(type))

/* for 64bit */
#define ELF64_R_INFO(sym, type)       (((Elf64_Xword)(sym)<<32)+ \ 
                                        (Elf64_Xword)(type))

Таким образом, вы можете извлечь индекс sym, а затем извлечь запись из таблицы символов, которая имеет поле st_name, который является индексом в таблице строк, которая содержит имя символа в представлении символов.

Ссылки для получения дополнительной информации:

описание раздела rel.dyn -> описание таблицы символов -> описание таблицы строк

...