13

共有ライブラリがロードされたときに「通知」される方法はありますか?

つまり、共有ライブラリでdlopenを使用するとします。共有ライブラリで (存在する場合) 自動的に呼び出される関数はありますか (例: main?)

4

3 に答える 3

22

ライブラリは、gcc __attribute__((constructor)) および __attribute__((destructor)) 関数属性を使用して、初期化およびクリーンアップ ルーチンをエクスポートする必要があります。これらの情報については、gcc の情報ページを参照してください。コンストラクター ルーチンは、dlopen が戻る前 (または、ライブラリが読み込み時に読み込まれる場合は main() が開始される前) に実行されます。デストラクタ ルーチンは、dlclose が戻る前 (または、ロード時にライブラリがロードされている場合は、exit() または main() の完了後) に実行されます。これらの関数の C プロトタイプは次のとおりです。

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

http://tldp.org/HOWTO/Program-Library-HOWTO/index.htmlから取得

つまり、共有ライブラリがロードされたときに呼び出される関数に __attribute__ ((constructor)) を追加するだけです。上記のドキュメントには、古い _ini および _fini 関数が廃止されたと見なされていることも記載されています。

于 2009-10-21T17:55:19.733 に答える
17

はい。ライブラリが開かれると、すべての静的構築が行われます... したがって、C++ を使用している場合は、次のことができます。

// mylibrary.cpp
名前空間
{
    クラス dynamic_library_load_unload_handler
    {
         公衆:
              dynamic_library_load_unload_handler(){
                    // ライブラリのロード時に実行するコード
              }
              ~dynamic_library_load_unload_handler(){
                    // ライブラリのアンロード時に実行するコード
              }
    } dynamic_library_load_unload_handler_hook;
}

__attribute__ ((constructor))与えられたソリューションとは異なり、これは移植可能です。ただし、このように複数のオブジェクトがある場合、構築/破棄の順序に関しては保証されないことに注意してください。

于 2009-10-21T20:29:10.910 に答える
0

少なくともLinux、そしておそらく少なくとも他のいくつかのUnixシステムでは、ライブラリが動的に開かれると、という名前のグローバル関数_initが存在する場合は、動的リンカーによって呼び出されます。

于 2009-10-21T17:45:59.303 に答える