dlopen() 内で発生するすべてのファイル システム アクセスをインターセプトしたい。最初は、実行可能な解決策のように見えますが、いくつLD_PRELOADか-Wl,-wrap,の技術的な理由により、それらを機能させるのに問題がありました。
ld.so は、LD_PRELOAD が処理されるまでに、独自のシンボルを既にマップしています。最初の読み込みをインターセプトすることは重要ではありませんが、
_dl_*ワーカー関数はこの時点で解決されるため、以降の呼び出しはそれらを通過します。LD_PRELOAD遅すぎると思います。ld.soの内部には機能的な がなく、 を呼び出すだけな
mallocので、上記の問題を何らかの形で回避します。malloc()free()memset()__libc_read()に含まれるファイル システム ワーカー関数ld.soは静的であるため、 でインターセプトできません-Wl,-wrap,__libc_read。
これはすべてld.so、ソースをラッパーにリンクするのではなく、ソースから直接ビルドする必要があることを意味する場合があります。ここでの課題は、 と の両方libcがrtld-libc同じソースから構築されていることです。のビルド時にマクロIS_IN_rtldが定義されることはわかってrtld-libcいますが、パブリック インターフェイス関数をエクスポートしながら、静的データ構造のコピーが 1 つだけであることをどのように保証できますか? (これは glibc ビルド システムに関する質問ですが、これらの詳細に関するドキュメントは見つかりませんでした。)
中に入るより良い方法はありますdlopen()か?
注:FUSEこれは、そのようなことをサポートしない最小限の「計算ノード」カーネル用であるため、Linux固有のソリューションは使用できません。