我正在从事一个跨平台项目,该项目由多个库组成,根据运行时条件动态地相互加载和卸载。目前我观察到一个崩溃,这似乎是由共享库之一中的静态对象在使用dlclose()卸载共享库之前被销毁这一事实引起的。这看起来很奇怪,对我来说更像是一个错误。为了调查这个问题,我创建了一个简单的项目,它包含三个源文件:main.cpp、lib1.cpp和lib2.cpp(分别用于可执行文件和两个库)。主可执行文件动态加载lib1,而lib1又动态加载lib2。主要.cpp:LoggermainGlobal("mainGlobal");intmain(intargc,char*argv[]){Loggermai
我有一个有趣的问题,我在互联网上的研究似乎没有解决。我正在尝试使用dlfcn.h中的函数在我的C++项目中动态加载库。问题是当我尝试在运行时重新加载插件时(因为我对它们中的任何一个进行了更改),调用dlclose()时主程序崩溃(段错误(核心转储))。这是我重现错误的示例:主要.cpp:#include#include#include#include"IPlugin.h"intmain(){void*lib_handle;char*error;while(true){std::coutexec();destroy_tfn_destroy=(destroy_t)dlsym(lib_han
我有一个使用dlopen加载的共享库(带有标志RTLD_NOW|RTLD_GLOBAL)。如果这个库正在使用主程序中的函数,那么它不会卸载。所以我最终得到了这个共享库的相同代码,即使我卸载(使用dlclose)、更改、编译、(重新)加载它也是如此。我的目标实际上是在对同一个库进行更改后重新加载它,这样我就不必重新启动整个程序来测试我的代码。我在LinuxUbuntu10.04上使用g++4.2.3。(编辑)已解决:“由于RTLD_GLOBAL,加载的库使用了一个符号”。确实,我在链接时嵌入了另一个.a的符号,这些符号可能被回调并阻止我的库关闭......我认为可以使用dlopen(..
我在Android上使用动态加载API(:dlopen()、dlclose()等)时遇到一些问题。我正在使用NDK独立工具链(版本8)来编译应用程序和库。Android版本为2.2.1Froyo。这是简单共享库的源代码。#includeintiii=0;int*ptr=NULL;__attribute__((constructor))staticvoidinit(){iii=653;}__attribute__((destructor))staticvoidcleanup(){}intaaa(inti){printf("aaa%d\n",iii);}这是使用上述库的程序源代码。#inc
我在Android上使用动态加载API(:dlopen()、dlclose()等)时遇到一些问题。我正在使用NDK独立工具链(版本8)来编译应用程序和库。Android版本为2.2.1Froyo。这是简单共享库的源代码。#includeintiii=0;int*ptr=NULL;__attribute__((constructor))staticvoidinit(){iii=653;}__attribute__((destructor))staticvoidcleanup(){}intaaa(inti){printf("aaa%d\n",iii);}这是使用上述库的程序源代码。#inc
我的程序使用dlopen加载共享对象,然后使用dlclose卸载它。有时会再次加载此共享对象。我注意到静态变量没有重新初始化(这对我的程序很重要)所以我在dlclose之后添加了一个测试(dlopen和RTLD_NOLOAD)>看看库是否真的被卸载了。果然还在内存中。然后我尝试反复调用dlclose直到库真正卸载,但我得到的是一个无限循环。这是我用来检查库是否已卸载的代码:dlclose(handles[name]);do{void*handle=dlopen(filenames[name],RTLD_NOW|RTLD_NOLOAD);if(!handle)break;dlclose(
我的程序使用dlopen加载共享对象,然后使用dlclose卸载它。有时会再次加载此共享对象。我注意到静态变量没有重新初始化(这对我的程序很重要)所以我在dlclose之后添加了一个测试(dlopen和RTLD_NOLOAD)>看看库是否真的被卸载了。果然还在内存中。然后我尝试反复调用dlclose直到库真正卸载,但我得到的是一个无限循环。这是我用来检查库是否已卸载的代码:dlclose(handles[name]);do{void*handle=dlopen(filenames[name],RTLD_NOW|RTLD_NOLOAD);if(!handle)break;dlclose(
plugin1.cpp:#includestaticclassTestStatic{public:TestStatic(){std::couthost.cpp#include#includeintmain(intargc,char*argv[]){void*handle=dlopen("./plugin1.so",RTLD_NOW|RTLD_LOCAL);dlclose(handle);return0;}构建并运行:>g++-cplugin1.cpp-oplugin1.o-fPIC>g++-sharedplugin.o-oplugin1.so>g++host.cpp-ohost-ldl
plugin1.cpp:#includestaticclassTestStatic{public:TestStatic(){std::couthost.cpp#include#includeintmain(intargc,char*argv[]){void*handle=dlopen("./plugin1.so",RTLD_NOW|RTLD_LOCAL);dlclose(handle);return0;}构建并运行:>g++-cplugin1.cpp-oplugin1.o-fPIC>g++-sharedplugin.o-oplugin1.so>g++host.cpp-ohost-ldl
在主程序中,我dlopen和dlclose(分别为LoadLibrary和FreeLibrary)一个共享库。共享库包含一个静态变量,该变量在dlopen时实例化,并在dlclose时销毁。此行为在MSVC2008和2013、GCC3.4.6和Sunstudio12.1上是一致的。但是,对于GCC4.9.1和GCC5.2.1,析构函数不再在dlclose上调用。相反,它在程序退出之前被调用。静态变量类的特殊性在于,在构造函数中,有一个对返回局部static的模板化函数get(全局作用域)的调用变量。我能够使用以下链接到共享库的cpp文件重现此行为:#includetemplate//I