Как найти абсолютный адрес символа разделяемых библиотек? - PullRequest
5 голосов
/ 09 февраля 2010

Я хочу написать трассировщик маленькой функции. Я использую ptrace.

Когда я вижу инструкцию CALL, я хочу показать имя функции, эквивалентное адресу вызова.

Мой трассировщик работает с символами с абсолютным адресом (определение символов в основном двоичном файле). Но я не знаю, как я могу получить абсолютный адрес в виртуальной памяти функции общей библиотеки. Например, определите вызов функций libc.

Я заметил, что адрес функции в общей библиотеке относительно файла.

Хорошо ли следующее уравнение?

Absolute address of symbol = address of the shared library in virtual memory +
                             relative address of the symbol.

Как я могу получить абсолютный адрес символа из общей библиотеки?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Я думаю, вы хотите посмотреть, как работает динамическое связывание, в частности, глобальная таблица смещений. http://www.gentoo.org/proj/en/hardened/pic-guide.xml является своего рода началом, но заставить его работать надежно во всех системах может быть сложно.

1 голос
/ 23 марта 2010

Книга 'Линкеры и загрузчики' содержит ответы на такие вопросы, а также справочные пояснения. Возможно, стоит прочитать. То, что относится к ELF, не относится к Windows, но книга охватывает и те, и другие системы.

0 голосов
/ 09 февраля 2010

Как только вы не описали систему, в которой вы работаете, эта статья уточняет, что по крайней мере описанная задача может быть решена в некоторых случаях, а не для всех.
Если бы я был в вашей ситуации, я бы искал соответствующие двоичные фрагменты в памяти и в библиотеке. Затем, как только память и библиотека выровнены, проблема решена. Так что да, уравнение хорошо, как только библиотека не может быть разделена и загружена как независимые части.

...