рассмотрит следующий код для динамической загруженной библиотеки, построенной с г ++ - 4.7 на Linux, -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()
?