Могу ли я получить имя символа по "ПОЛУЧЕННЫЙ адрес"?
Сейчас я занимаюсь разработкой программы вроде 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 -> описание таблицы символов -> описание таблицы строк