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固有のソリューションは使用できません。