5

Linux で write() システム コールをキャプチャするために LD_PRELOAD を使用しています。システムコールの書き込みに対してこれを正常に実行し、機能させることができました。

しかし、その時に printf() を呼び出すと、機能しません。strace を使用して printf スタック トレースを観察すると、最後に printf が write() システム コールを呼び出してコンソールに書き込むことがわかりましたが、その時点で、実際に write() システム コールを呼び出す前に write() システム コールが呼び出されていません。 .

なぜこれが起こっているのか誰にも分かりますか?

4

1 に答える 1

11

あるライブラリから別のライブラリへ、または実行可能ファイルから動的にロードされたライブラリへの関数呼び出しは、PLT (Procedure Linkage Table) を経由し、LD_PRELOAD を使用してリダイレクトできます。ただし、ライブラリ内の関数呼び出しはコンパイル時に解決でき、PLT を通過しません。したがって、LD_PRELOAD によってリダイレクトすることはできません。printf と write はどちらも libc.so.6 にコンパイルされるため、printf からの write の呼び出しは PLT を経由してリダイレクトの可能性を探すことはありませんが、アプリケーション (または別の共有ライブラリ) から直接 write を呼び出すと、リダイレクトが行われます。 .

于 2011-03-22T18:40:51.740 に答える