在Mac OSX中加载和卸载共享库

问题描述:

如果在此论坛中重复此问题,我很抱歉。我有一个问题,在Mac上加载和卸载dylibs不能按预期工作(尤其是卸载部分)。 问题是如果我有一个可执行文件,并且如果我加载共享库说A.dylib,然后使用加载的共享库加载库说B.dylib。当我尝试在稍后阶段卸载库B.dylib时,没有返回错误代码(返回int值为0--因为我使用常规的dlopen和dlclose函数来装载和卸载库,0表示卸载成功) ,但是当我检查确保使用活动监视器或lsof时,b.dylib仍在内存中。在Mac OSX中加载和卸载共享库

现在我们正在将此代码移植到windows,linux & mac。 Windows和Linux按预期工作,但只有Mac给我带来问题。

我正在阅读mac开发者库,发现:“有几种情况下动态库永远不会被卸载: 1)主要的可执行链接违背它,2)一个API不是supoort卸载(例如NSAddImage()) 用于加载它或其他依赖它的动态库,3)动态库在 dyld的共享缓存中。“

在我的情况下,我不会跌倒前两种情况之一。我怀疑case3。
这是我的问题: 1.我能做些什么来确保我有案例3? 2.如果是,如何解决? 3.如果没有,如何解决它? 4.为什么mac如此不同?

在这方面的任何帮助表示赞赏!

感谢, 扬

当加载共享库到可执行文件,所有由该库导出的符号的考生,以解决由可执行所需的符号,造成库如果dyld的连接器保持装载绑定到一个无意的符号。您可以使用nm列出共享库中的符号,并且可以设置环境变量以启用动态链接程序的调试输出(请参阅dyld上的手册页)。您需要设置DYLD_PRINT_BINDINGS环境变量。

最有可能的是,您需要将导出的符号限制为可执行文件使用的特定子集,以便只限制您打算使用的符号。这可以通过将所需符号放置在文件中并通过-exported_symbols_list选项将其传递给链接器来完成。如果不这样做,您可以最终在dyloaded库中绑定一个符号,并且它不会被卸载,因为它们需要解析可执行文件中的符号,并且在调用dlclose()时不会卸载。

+0

不错的一个。 gotcha ...感谢您的帮助 – jan