c++ - dylib 析构函数不会被调用

标签 c++ macos gcc code-injection dylib

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

 __attribute__((constructor))
 static void initialize()

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

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

最佳答案

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

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

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

关于c++ - dylib 析构函数不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531136/

相关文章:

macos - OSX 状态菜单在 Swift 中不起作用

linux - 如何在 Ubuntu 上安装/编译 lgmask?

C++ 链接失败, undefined reference

c++ - 连续使用 std::list 导致崩溃

c++ - 在递归函数c++中保持原始值

c++ - 从 Windows 注册表中保存的工作区检索窗口位置

c# - C 中的 allocVector() 和 System.AccessViolationException : Attempted to read or write protected memory?

macos - 编译时出现 Perl 语法错误 - 表达式中不允许出现 "use"

Mac 上的 C# 启动进程 - FFMPEG - 退出代码 1

链接时可以混合使用静态库和共享对象库吗?