LD_PRELOAD не работает для printf - PullRequest
5 голосов
/ 22 марта 2011

Я использую LD_PRELOAD для захвата системного вызова write () в Linux. Я успешно могу сделать это для записи системного вызова и заставить его работать.

Но когда я вызываю printf (), это время не работает. Если мы наблюдаем трассировку стека printf с использованием strace, я обнаружил, что в конце printf вызывает системный вызов write () для записи в консоль, но в то время мой системный вызов write () не вызывался до фактического вызова системного вызова write (). .

Кто-нибудь знает, почему это происходит?

1 Ответ

11 голосов
/ 22 марта 2011

Вызовы функций, сделанные из одной библиотеки в другую или из исполняемого файла в динамически загружаемую библиотеку, проходят через PLT (таблицу связывания процедур) и могут быть перенаправлены с помощью LD_PRELOAD.Однако вызовы функций в библиотеке могут быть разрешены во время компиляции и не проходят через PLT.Поэтому они не могут быть перенаправлены LD_PRELOAD.Так как printf и write оба скомпилированы в libc.so.6, вызов write из printf никогда не проходит через PLT для поиска возможного перенаправления, но когда вы вызываете write напрямую из вашего приложения (или из другой разделяемой библиотеки), он делает.

...