共有ライブラリがロードされたときに「通知」される方法はありますか?
つまり、共有ライブラリで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が存在する場合は、動的リンカーによって呼び出されます。