Linux 下 so 共享库的 dlclose 卸载问题
在 Linux 下创建一个共享库,在该库中使用
同时创建一个测试的 Console 程序,测试加载和卸载。
简单的情况下,当dlopen 的时候,Init 函数被调用, dlclose 的时候,Final 函数被调用。
但是,当我在共享库中添加一个类。并且这个类中添加一个成员函数(不管是否是静态的)。
如果这个函数使用了一个静态变量(不是类的静态变量,是函数的静态变量)。
同时导出函数的呼叫路径上使用了这个函数。
那么此时 当 dlclose 的时候, Final 函数没有被调用。而是等到整个 Console 程序退出时, Final 函数才被调用。
共享库的 main.cpp 代码
// 测试代码 main.c 代码。
请教一下,这是什么问题。
还有就是怎样解决这个问题。
我需要在成员函数中定义静态变量。
void Init(void) __attribute__((constructor));
void Final(void) __attribute__((destructor));
标识一对函数,来显示模块的加载和卸载。同时创建一个测试的 Console 程序,测试加载和卸载。
简单的情况下,当dlopen 的时候,Init 函数被调用, dlclose 的时候,Final 函数被调用。
但是,当我在共享库中添加一个类。并且这个类中添加一个成员函数(不管是否是静态的)。
如果这个函数使用了一个静态变量(不是类的静态变量,是函数的静态变量)。
同时导出函数的呼叫路径上使用了这个函数。
那么此时 当 dlclose 的时候, Final 函数没有被调用。而是等到整个 Console 程序退出时, Final 函数才被调用。
共享库的 main.cpp 代码
class CMath
{
public:
void A()
{
int const es[] = { 1, 2 };
int index = 0;
printf("%d", es[index]);
}
static void B()
{
static int const es[] = { 1, 2 };
int index = 0;
printf("%d", es[index]);
}
// static void C()
// {
// int const index = 0;
// printf("%d", _es[index]);
// }
//
// static int const _es[2];
};
//int const CMath::_es[2] = {1, 2};
void Export()
{
//CMath _;
//_.A();
CMath::B();
//CMath::C();
}
void Export() __attribute__((visibility("default")));
static void _Init(void)
{
printf("module loaded.\n");
}
static void _Final(void)
{
printf("module unloaded.\n");
}
void _Init(void) __attribute__((constructor));
void _Final(void) __attribute__((destructor));// 测试代码 main.c 代码。
int main()
{
void *handle;
printf("dlopen ...\n");
handle = dlopen("libShare.so", RTLD_LAZY);
printf("dlopened.\n");
assert(handle);
printf("dlclose ...\n");
dlclose(handle);
printf("dlclosed.\n");
return getchar();
}
请教一下,这是什么问题。
还有就是怎样解决这个问题。
我需要在成员函数中定义静态变量。
...全文
相关推荐
dlopen-dlsym-dlclose函数介绍
dlopen-dlsym-dlclose函数介绍,具体介绍该函数定义、使用等
2.库和内存管理等
linux系统编程的文档 覆盖广
libltdl学习示意代码
自己学习libltdl时写下的示意代码, 供自己以后备忘, 同时供大家参考
动态库的创建和使用——静态加载
动态库的创建和使用——静态加载 动态库的创建和使用——静态加载 动态库的创建和使用——静态加载 动态库的创建和使用——静态加载
采用dlopen、dlsym、dlclose加载动态链接库
linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来


