Я хочу записать трассировщик небольшой функции. Я использую ptrace.
Когда я вижу Команду вызова, я хочу показать имя функции, эквивалентное адресному вызову.
Моя работа трассировщика с символами с абсолютным адресом (символ определяют в основном двоичном файле). Но я не знаю, как я могу получить абсолютный адрес в виртуальной памяти функции общей библиотеки. Обнаружьте вызов к функциям libc, например.
Я замечаю, что адрес функции в общей библиотеке относительно файла.
Следующее уравнение хорошо?
Absolute address of symbol = address of the shared library in virtual memory +
relative address of the symbol.
Как я могу получить абсолютный адрес символа из общей библиотеки?
Если вы не описали систему, над которой работаете, эта статья поясняет, что по крайней мере описанная задача может быть решена за в некоторых случаях не для всех.
Если бы я был в вашей ситуации, я бы поискал соответствующие двоичные фрагменты в памяти и в библиотеке. Затем, как только память и библиотека будут согласованы, проблема решена. Так что да, уравнение подходит, если библиотеку нельзя разделить и загрузить как независимые части.
Я думаю, вы хотите посмотреть, как работает динамическое связывание, в частности, глобальную таблицу смещения. http://www.gentoo.org/proj/en/hardened/pic-guide.xml - это своего рода начало, но заставить его работать надежно в разных системах может быть непросто.
Книга «Линкеры и загрузчики» содержит ответы на такие вопросы, а также общие пояснения. Возможно, стоит прочитать. То, что применимо к ELF, не применимо к Windows, но книга охватывает обе - и некоторые другие системы тоже.