linux dlopen:ライブラリを“ notified”にすることができますロードされたとき?

StackOverflow https://stackoverflow.com/questions/1602398

  •  05-07-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

  

ライブラリは初期化をエクスポートする必要があります   および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

THatは、共有ライブラリがロードされたときに呼び出す関数に__attribute__((コンストラクタ))を追加するだけです。上記のdocuemtnでは、古い_iniおよび_fini関数は廃止されたと見なされていることにも注意しています。

他のヒント

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

// mylibrary.cpp
namespace
{
    class dynamic_library_load_unload_handler
    {
         public:
              dynamic_library_load_unload_handler(){
                    // Code to execute when the library is loaded
              }
              ~dynamic_library_load_unload_handler(){
                    // Code to execute when the library is unloaded
              }
    } dynamic_library_load_unload_handler_hook;
}

指定された __ attribute__((constructor))ソリューションとは異なり、これは移植可能です。ただし、このようなオブジェクトが複数ある場合は、構築/破棄の順序に関する保証はありません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top