linux dlopen:ライブラリを“ notified”にすることができますロードされたとき?
-
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
という名前のグローバル関数が存在する場合、動的リンカーによって呼び出されます。