私は現在、いくつかのシステムコールと低レベル関数、例えばmmap
、brk
、sbrk
の使用状況を追跡する必要があるプロジェクトに取り組んでいます。これまでは関数の介在を使用していました。置き換えようとしている関数(例:mmap
)と同じ名前のラッパー関数を作成し、LD_PRELOAD
環境変数を設定してプログラムにロードします。私はdlsym
でロードするポインタを通して実際の関数を呼び出します。dlsymを使用しないLinuxでの関数の介入
残念ながら、私がラップする機能の1つであるsbrk
は内部でdlsym
で使用されているため、シンボルをロードしようとするとプログラムがクラッシュします。 sbrk
はLinuxのシステムコールではないので、単にsyscall
を使って間接的に呼び出すことはできません。
だから、どのように私はdlsym
を使用せずに、同じ名前のラッパー関数からライブラリ関数を呼び出すことができている私の質問?元の関数を参照できるコンパイラトリック(gccを使用)がありますか?
これは素晴らしいです。私は--wrapオプションについて聞いたことはありませんでしたが、これは私が必要とするものです。ありがとうございました。 –
明確にするために、実行ファイルをリンクするとき、またはラッパーを含むLD_PRELOADライブラリをリンクするときに、-wrapフラグを渡す必要がありますか?また、実行可能ファイルのPLTエントリの変更に関する詳細情報を提供することを検討しますか? –
設計されたユースケースは* target *アプリを--wrapとリンクするためのものです。 LD_PRELOADのケースでも動作させることは可能かもしれませんが、わかりませんが、テストする必要があります。 –