プロセス内の動的ライブラリへの参照の数を調べる方法はありますか? つまり、アプリケーションでは、多くのモジュールが dlopen を使用して同じライブラリをロードしている可能性があり、モジュールが dlclose を実行した場合、ライブラリが本当にアンロードされているのか、それとも参照が減分されているだけなのかを知ることができますか?
2 に答える
マニュアルページから:
dlclose()
関数 dlclose()は、ダイナミック ライブラリ ハンドル handleの参照カウントをデクリメントします。参照カウントがゼロになり、他のロード済みライブラリがシンボルを使用していない場合、動的ライブラリはアンロードされます。
関数 dlclose() は、成功すると 0 を返し、エラーの場合はゼロ以外を返します。
したがって、参照カウントは自動的に行われますが、この呼び出しが最後の呼び出しであり、ライブラリをアンロードするという事実は示されません。必要に応じて、自分自身を数える必要があります。
dlopen
または、のRTLD_NOLOAD
後に次のようにすることもできますdlclose
。
ライブラリをロードしないでください。これは、ライブラリがすでに常駐しているかどうかをテストするために使用できます (dlopen() は、常駐していない場合は NULL を返し、常駐している場合はライブラリのハンドルを返します)。
(参照を取得した場合は、もう一度行う必要があることに注意してくださいdlclose()
。これは際どいので、すべての潜在的な操作が単一のスレッドで発生するか、シリアル化されていることを確認してください。)
RTLD_NODELETE
オプションに興味があるかもしれません:
dlclose() 中にライブラリをアンロードしないでください。その結果、後でライブラリが dlopen() で再ロードされた場合、ライブラリの静的変数は再初期化されません。このフラグは POSIX.1-2001 では指定されていません。
ファイルを確認することで、ライブラリがプロセス アドレス空間からマップ解除されているかどうかを確認できます/proc/self/maps
。
これはおそらく Linux 固有のものではないかと思いますが、動作するはずです。