dylib析构函数不会被调用

时间:2011-09-23 15:06:14

标签: c++ macos gcc code-injection dylib

我有一个dylib,我可以通过注入在mac os x上加载。 构造函数调用运行良好。

 __attribute__((constructor))
 static void initialize()

但析构函数不会被调用?因此资源初始化泄漏。

__attribute__((destructor))
static void destroy()
  1. 如果应用程序退出,dylib会自动卸载吗?
  2. 如果应用程序退出,是否会自动卸载已注入的dylib?
  3. 我们如何在运行时从应用程序中卸载dylib?作为它的注入代码,我可以访问私有区域。有命令这样做吗?

1 个答案:

答案 0 :(得分:4)

1,2:否。当应用程序退出时,库并没有真正卸载 - 它们恰好与其他进程一起消失,就像其他资源一样(例如,文件句柄,映射内存,套接字,)在退出时释放。

3:取决于你如何注入库。如果您使用dlopen()之类的东西加载它,您应该能够使用dlclose()卸载库;例如; NSBundle有相同的东西。

请记住,卸载库很麻烦。特别是,卸载包含任何ObjC类的库是不安全的,因为运行时可能已经缓存了对类的引用。