Я работаю над программой, которая будет анализировать объектные файлы в форматах ELF и PE (тип школы / исследовательский проект). Сейчас я собираюсь обработать динамические символы импорта в исполняемых файлах. Я хотел бы найти как можно больше информации о символе.
В формате PE импорт хранится в разделе .idata
. Есть несколько таблиц с разной информацией, но что меня интересует, так это то, что нет проблем выяснить, в какой библиотеке определяется символ. Всегда есть имя разделяемой библиотеки и затем импортируемые из нее имена / порядковые номера символов.
Я хотел бы также найти такую информацию в файлах ELF. Все импорт / экспорт находятся в разделе .dynsym
- таблица динамических символов. Импортируемые символы помечаются как неопределенные, например:
00000000 DF *UND* 00000000 GLIBC_2.0 fileno
Но нет информации, что является исходным файлом этого символа. Все необходимые общие библиотеки перечислены в разделе .dynamic
, например:
Dynamic Section:
NEEDED libz.so.1
Только информация о библиотеке в символе является версией String = GLIBC_2.0
. Я думал о том, чтобы получить реальное имя библиотеки через это, но когда я посмотрел на вывод objdump -p
, я обнаружил, что GLIBC_2.0
может быть связан с несколькими библиотеками:
Version References:
required from libm.so.6:
0x0d696910 0x00 13 GLIBC_2.0
required from libgcc_s.so.1:
0x0b792650 0x00 12 GLIBC_2.0
Если я правильно понимаю процесс динамического связывания ELF, не будет возможности найти эту информацию в исполняемом файле ELF. Откуда именно импортируется символ, определяется компоновщиком после загрузки всех таблиц символов в память.
Но я хотел бы убедиться в этом, прежде чем я продолжу, поэтому мой вопрос: есть ли способ, как я могу узнать имя общей библиотеки символов из исполняемого файла ELF?
Спасибо за любой совет.