web-dev-qa-db-ja.com

LinuxでDllMainに相当

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

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

25
Seva Alekseyev
  1. いいえ、DllMainに相当するものはありません。

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

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

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

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

15
Alex Cohn

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

20
doron

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

6
James Kanze