5

Mac OS Xでインジェクションを介してロードできるdylibがあります。コンストラクター呼び出しはうまく機能します。

 __attribute__((constructor))
 static void initialize()

しかし、デストラクタは呼び出されませんか? したがって、リソースがリークを初期化しました。

__attribute__((destructor))
static void destroy()
  1. アプリケーションが終了すると、dylib は自動的にアンロードされますか?
  2. アプリケーションが終了すると、注入された dylib は自動的にアンロードされますか?
  3. 実行時にアプリケーションから dylib をアンロードするにはどうすればよいですか? そのインジェクション コードとして、プライベート エリアにアクセスできます。これを行うコマンドはありますか?
4

1 に答える 1

4

1、2: いいえ。ライブラリは、アプリケーションの終了時に実際にはアンロードされません。ライブラリは、他のリソース (ファイル ハンドル、マップされたメモリ、ソケットなど) と同じように、残りのプロセスと共にたまたま消えてしまいます。) は終了時に解放されます。

3: ライブラリの注入方法によって異なります。のようなものを使用してロードした場合、たとえば、dlopen()を使用してライブラリをアンロードできるはずです。相当するものがあります。dlclose()NSBundle

ライブラリのアンロードは面倒なことに注意してください。特に、ランタイムがクラスへの参照をキャッシュしている可能性があるため、ObjC クラスを含むライブラリをアンロードすることは安全ではありません。

于 2011-09-23T18:58:42.547 に答える