共有ライブラリがロードされたときに「通知」される方法はありますか?
つまり、共有ライブラリでdlopenを使用するとします。共有ライブラリで (存在する場合) 自動的に呼び出される関数はありますか (例: main?)
共有ライブラリがロードされたときに「通知」される方法はありますか?
つまり、共有ライブラリで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から取得
つまり、共有ライブラリがロードされたときに呼び出される関数に __attribute__ ((constructor)) を追加するだけです。上記のドキュメントには、古い _ini および _fini 関数が廃止されたと見なされていることも記載されています。
はい。ライブラリが開かれると、すべての静的構築が行われます... したがって、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))
与えられたソリューションとは異なり、これは移植可能です。ただし、このように複数のオブジェクトがある場合、構築/破棄の順序に関しては保証されないことに注意してください。
少なくともLinux、そしておそらく少なくとも他のいくつかのUnixシステムでは、ライブラリが動的に開かれると、という名前のグローバル関数_init
が存在する場合は、動的リンカーによって呼び出されます。