2

open()、close()、connect()などのlibc内のいくつかのライブラリ関数の使用状況を追跡するために、介入ライブラリを作成しています。これは、ほとんどのアプリケーションで一般的にうまく機能します。ただし、特にPHPのMySQLモジュールを使用してPHPで試してみると、このモジュール内のlibcへの関数呼び出しは追跡されません(したがって、connect()、socket()などはありません)。'strace'は、システムがsocket()、connect()などを呼び出すことを教えてくれました。モジュールとlibmysqlclient.so.16.0.0で「file」を実行すると、それらはすべて動的にリンクされていると言われました。したがって、静的リンケージによって引き起こされる問題ではないはずです。何が問題なのでしょう?

Fedora1164ビットバージョンを使用しています。

ありがとうございました。

4

3 に答える 3

2

スタティックリンケージが原因ではなかったようです。実際、PHP は他のライブラリと動的にリンクされています。この問題は、PHP が拡張機能をロードする方法に依存しています。

PHP はフラグ RTLD_LAZY を指定して dlopen() を呼び出すことによって拡張機能をロードします。これは、参照が実行されたときにのみシンボルが解決されることを意味します。これは、LD_PRELOAD で指定された割り込みをバイパスします。

于 2009-10-27T02:32:52.447 に答える
0

ライブラリが何らかの理由でシステム コールを直接呼び出している可能性があります。この場合、この使用状況を追跡するためにstrace(またはptrace()独自のプログラムで) を使用する必要があります。

于 2009-10-25T18:35:39.037 に答える
0

これらのライブラリがlibcのopen()、write()などの呼び出しをバイパスしている可能性があるという上記の回答に同意します。つまり、これらのライブラリは、libcインターフェイスを使用せずに、アセンブリを使用してシステムコールを直接呼び出している可能性があります。 . システムコールを直接使用するアプリケーションを見るのはそれほど一般的ではありませんが、前代未聞ではありません.. その場合、ライブラリ介入実験でインターセプトが見られないのはそのためです. strace を介した簡単な方法と、カーネル レベルでこれらの呼び出しをインターセプトし、構築しているフレームワークにレポートするカーネル モジュールの構築におけるより複雑な方法
..楽しんでください..ErnestoB

于 2010-05-17T20:28:21.777 に答える