Как находят абсолютный адрес символа общих библиотек?

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

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

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

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

Следующее уравнение хорошо?

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

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

5
задан Jonathan Leffler 23 March 2010 в 00:21
поделиться

3 ответа

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

0
ответ дан 15 December 2019 в 06:25
поделиться

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

2
ответ дан 15 December 2019 в 06:25
поделиться

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

1
ответ дан 15 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: