dylib析构函数不会被调用

RLT*_*RLT 5 c++ macos gcc code-injection dylib

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

 __attribute__((constructor))
 static void initialize()
Run Code Online (Sandbox Code Playgroud)

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

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

小智 4

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

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

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