Могу ли я получить имя символа по "ПОЛУЧЕННЫЙ адрес"?

Сейчас я занимаюсь разработкой программы вроде 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 ответ

Решение

Каждая запись в .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 -> описание таблицы символов -> описание таблицы строк

Другие вопросы по тегам