5

我有一个 dylib,我可以通过注入在 mac os x 上加载它。构造函数调用效果很好。

 __attribute__((constructor))
 static void initialize()

但是析构函数没有被调用?因此资源初始化泄漏。

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

1 回答 1

4

1、2:不。当应用程序退出时,库并没有真正卸载——它们只是碰巧随着进程的其余部分消失,就像其他资源(例如,文件句柄、映射内存、套接字)一样) 在退出时被释放。

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

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

于 2011-09-23T18:58:42.547 回答