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

时间:2012-10-17 14:12:59

标签: shared-libraries

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

现在我们正在为windows,linux和amp;移植这段代码。苹果电脑。 Windows和Linux按预期工作,但只有mac给我带来了问题。

我正在阅读mac开发人员库并发现:“有几种情况永远不会卸载动态库:      1)反对它的主要可执行文件链接,2)不支持卸载的API(例如NSAddImage())      用于加载它或其他依赖它的动态库,3)动态库在      dyld的共享缓存。“

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

对此方面的任何帮助表示赞赏!

谢谢, 扬

1 个答案:

答案 0 :(得分:5)

将共享库加载到可执行文件中时,该库导出的所有符号都可以解析可执行文件所需的符号,如果DYLD链接器绑定到非预期的符号,则会导致库保持加载状态。您可以使用nm列出共享库中的符号,并且可以设置环境变量以启用动态链接器的调试输出(请参阅dyld上的this手册页)。您需要设置DYLD_PRINT_BINDINGS环境变量。

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

相关问题