28

*nix .so ライブラリでは、ライブラリがロードおよびアンロードされるときにシステムによって呼び出されるエントリ ポイントはありますか?

より実用的なメモ: .so が C++ で記述され、コンストラクタとデストラクタを含むグローバル オブジェクトが含まれ、構築/破棄の概念を持たない言語から読み込まれた場合、グローバル オブジェクトは適切に構築/破棄されますか?

4

3 に答える 3

23

__attribute__((constructor))および を使用して __attribute__((destructor))、共有ライブラリのロードおよびアンロード時にコードを実行できます。

于 2012-09-17T17:08:23.903 に答える
20
  1. いいえ、DllMainに相当するものはありません。

  2. AndroidなどのJNIライブラリの場合、JNI関数テーブルを埋めることを目的とした特別なエントリJNI_OnLoadが存在する場合があります。

  3. GCCは、共有ライブラリのロードで一部のコードを実行できるようにするための特別な属性コンストラクターを定義しています。

  4. C ++は、.soをロードしたコードがこれらのクラスを認識しているか、構築の概念を持っているかに関係なく、グローバルオブジェクトと静的オブジェクトのコンストラクターが実行されることを保証します。

    デストラクタについても同じことが言えますが、少なくとも一部のデストラクタが実行できない場合、たとえばsigfaultがあり、例外が無効になっている場合など、不幸な状況が発生する可能性があります。

于 2012-09-17T17:03:41.703 に答える
6

使用される手法は少し異なりますが、グローバル オブジェクトの構築/破棄は多かれ少なかれダイナミック ローダーに組み込まれています。(Windows でも、 を通過する必要はありません DllMain。グローバル オブジェクトは、とにかく正しく構築/破棄されます。)

于 2012-09-17T16:47:53.527 に答える