10

open、open64、stat、stat64sysの呼び出しをインターセプトしようとする小さな共有ライブラリを作成しました。LD_PRELOADをエクスポートしてoracleのsqlplusを実行すると、openおよびopen64呼び出しのトレースは表示されますが、statおよびstat64呼び出しのトレースは表示されません。共有ライブラリは、sys呼び出しのすべての定義を含む単一のcファイルです。一部のシステムコールが傍受され、他のシステムコールが傍受されないのはなぜですか?ご協力いただきありがとうございます。

4

1 に答える 1

19

GNUlibcは実装open()し、open64()期待どおりに(つまり、動的にリンクされたシンボルであり、フックできる)が、とでLD_PRELOAD特別なことを行うためです。stat()stat64()

libc(たとえば)によってエクスポートされたシンボルを見ると、実際にはシンボルまたは!nm -D /libc/libc.so.6を提供していないことがわかります。statstat64

これらの関数の呼び出しは、コンパイル時に(可能であれば)のインライン関数によってラップされるか、<sys/stat.h>(失敗すると)によって提供される静的にリンクされた定義によってラップされlibc_nonshared.aます。

呼び出される実際の動的リンク関数は__xstat()または__xstat64();です。struct statこれらは、追加の最初の引数である整数を取ります。整数は、呼び出し元が期待するレイアウトを示すバージョン番号です。代わりにこれらをフックしてみてください。

(このすべてのポイントは、ビットlibcのさまざまな互換性のないレイアウトと定義を使用するバイナリをサポートするために動的にリンクできるようにすることです。調べてみると、この効果へのコメントがあります。、、、、 およびも影響を受けます。同じ方法。)struct statmode_t/usr/include/sys/stat.hfstat()fstat64()lstat()lstat64()mknod()

于 2011-03-29T23:56:02.507 に答える