Как работает ltrace (инструмент трассировки библиотеки)?
Как работает трассировка?
Как он узнает, что программа вызывает функции библиотеки?
Есть ли какой-нибудь общий путь кода, через который проходят все вызовы библиотечных функций? Может быть, ltrace устанавливает точку останова в этом общем пути кода?
Спасибо!
1 ответ
Динамические исполняемые файлы имеют таблицу символов, используемую компоновщиком при разрешении ссылок, которые необходимо подключить к функциям библиотеки. (Вы можете увидеть это сами, запустив objdump -T /path/to/binary
).
Эта таблица символов доступна другим инструментам, таким как ltrace
Кроме того, тривиально определить, какие функции нужно подключить, и просмотреть этот список по отдельности.
Смотрите доклад о внутреннем устройстве ltrace, представленный на Ottowa Linux Symposium, который предоставляет подробное описание функций по функциям; Чтобы следить за источником, смотрите официальный репозиторий или стороннее зеркало github.
Некоторые более новые выпуски (более поздние, чем этот разговор) также попадаются на dlopen()
вызов, чтобы иметь возможность отслеживать вызов динамически загружаемых библиотек, а также. Механизм там должен быть довольно очевидным на мгновение - если можно заменить dlopen()
с прокладкой (когда dlopen()
сам по себе динамически связан, как описано выше), затем можно установить точку останова на любом указателе функции, который он возвращает.