Linux で g++-4.7 を使用してビルドされ、オプション -fPIC
でリンクされた動的ロード ライブラリの次のコードを検討してください。-rdynamic
struct Wrapper
{
libraryUnregisterCbMap_t instance;
Wrapper() : instance() { HDebugLog("Wrapper CTOR!");}
~Wrapper() { HDebugLog("Wrapper DESTRUCTOR!"); }
};
inline libraryUnregisterCbMap_t& getLibraryUnregisterMap()
{
static Wrapper unregisterLibraryMap;
HDebugLog("getLibraryUnregisterMap: we have " <<unregisterLibraryMap.instance.size() << " elements. the address of the map is " << &unregisterLibraryMap.instance);
return unregisterLibraryMap.instance;
}
void registerLibrary(callbackContainer_t* p)
{
auto& map = getLibraryUnregisterMap();
}
void unregisterLibrary()
{
auto& map = getLibraryUnregisterMap();
}
void __attribute__ ((constructor)) library_init()
{
static callbackContainer_t cbContainer;
HDebugLog("Library constructor: address of static cbContainer is: " << &cbContainer );
registerLibrary( &cbContainer);
}
void __attribute__ ((destructor)) library_fini()
{ unregisterLibrary(); }
私にとって興味深い/厄介な部分は、を呼び出した後に library_fini() が呼び出されていないことです。そのため、実行中にこのモジュールをロードすると、インスタンスのデストラクタがへの呼び出しの前lt_dlclose
に発生するため、ファイナライズにはあまり役に立たないようです。言うまでもなく、このデフォルトの動作には意味がありません。Wrapper
library_fini
この無意味な振る舞いを変えるにはどうすればよいですか? ライブラリのファイナライズ ルーチンで静的データをファイナライズする必要があります。lt_dlclose
が呼び出されないのはなぜlibrary_fini()
ですか?