*nix .so ライブラリでは、ライブラリがロードおよびアンロードされるときにシステムによって呼び出されるエントリ ポイントはありますか?
より実用的なメモ: .so が C++ で記述され、コンストラクタとデストラクタを含むグローバル オブジェクトが含まれ、構築/破棄の概念を持たない言語から読み込まれた場合、グローバル オブジェクトは適切に構築/破棄されますか?
*nix .so ライブラリでは、ライブラリがロードおよびアンロードされるときにシステムによって呼び出されるエントリ ポイントはありますか?
より実用的なメモ: .so が C++ で記述され、コンストラクタとデストラクタを含むグローバル オブジェクトが含まれ、構築/破棄の概念を持たない言語から読み込まれた場合、グローバル オブジェクトは適切に構築/破棄されますか?
__attribute__((constructor))
および を使用して __attribute__((destructor))
、共有ライブラリのロードおよびアンロード時にコードを実行できます。
いいえ、DllMainに相当するものはありません。
AndroidなどのJNIライブラリの場合、JNI関数テーブルを埋めることを目的とした特別なエントリJNI_OnLoadが存在する場合があります。
GCCは、共有ライブラリのロードで一部のコードを実行できるようにするための特別な属性コンストラクターを定義しています。
C ++は、.soをロードしたコードがこれらのクラスを認識しているか、構築の概念を持っているかに関係なく、グローバルオブジェクトと静的オブジェクトのコンストラクターが実行されることを保証します。
デストラクタについても同じことが言えますが、少なくとも一部のデストラクタが実行できない場合、たとえばsigfaultがあり、例外が無効になっている場合など、不幸な状況が発生する可能性があります。
使用される手法は少し異なりますが、グローバル オブジェクトの構築/破棄は多かれ少なかれダイナミック ローダーに組み込まれています。(Windows でも、 を通過する必要はありません
DllMain
。グローバル オブジェクトは、とにかく正しく構築/破棄されます。)