Разрешение динамического символа исполняемого файла с использованием LLVM

В настоящее время я использую LLVM's ObjectFile (documented здесь) для представления исполняемого файла. Я успешно прочитал в исполняемом файле ObjectFile и хотел бы определить, какие адреса назначения вызовов в моем исполняемом файле соответствуют именам символов, содержащимся в symbol_iterator, полученным вызовом функции begin_dynamic_symbols(). Итерация по каждому из символов в symbol_iterator дает мне имя каждого символа и его адрес, но поскольку символы являются динамическими, адрес каждого символа равен -1; это означает, что ObjectFile не связывает имена символов напрямую с их соответствующими адресами назначения вызова.

Есть ли способ определить, какие адреса назначения адреса сопоставляются с динамическими символами в ObjectFile? Я бы предпочел не вручную вычислять все прыжки через PLT и GOT, если я могу избежать этого.

Ответ 1

Адреса динамических символов вычисляются только тогда, когда файлы объектов загружаются в память и привязаны к таблице символов программы. В общем случае невозможно установить их окончательный адрес перед связыванием.

Возможно, вы сможете получить нужные данные с помощью модуля оптимизации времени LLVM вместо ObjectFile, поскольку при правильной загрузке модуля выполняется привязка адреса при загрузке модуля.

Удачи!