【问题标题】:dylib destructor does not get calleddylib 析构函数没有被调用
【发布时间】:2011-11-23 18:33:21
【问题描述】:

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

 __attribute__((constructor))
 static void initialize()

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2017-11-18
    • 2012-09-17
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2016-12-31
    相关资源
    最近更新 更多