如果这个问题以前在这个论坛上被重复了,我很抱歉。我有一个问题,在那里,加载和卸载dylibs不是如预期的Mac(特别是卸载部分)。问题是,如果我有一个可执行文件,如果我加载了一个共享库,比如A.dylib,然后使用加载的共享库来加载一个库,比如B.dylib。当我稍后尝试卸载库B.dylib时,没有返回错误代码(返回的int值是0-因为我使用常规的dlopen和dlclose函数来加载和卸载库,0表示卸载成功),但是当我检查以确保使用活动监视器或b.dylib的lsof仍然在内存中时。
现在我们正在为windows,linux和mac移植这段代码。Windows和Linux运行正常,但只有mac给我带来了问题。
我在mac developer库中阅读,发现:“有几种情况下,动态库永远不会被卸载: 1)主要的可执行链接指向它,2)不支持卸载的API (例如NSAddImage())被用来加载它或其他依赖于它的动态库,3)动态库在dyld的共享缓存中。”
在我的案例中,前两个案例中的任何一个我都没有。我在case3上怀疑。
我的问题是: 1.我可以做什么来确保我有案例3? 2.如果是,如何修复它? 3.如果不是,如何修复它? 4.为什么mac如此不同?
在这方面的任何帮助都是非常感谢的!
谢谢,Jan
发布于 2012-11-15 18:22:54
将共享库加载到可执行文件中时,该库导出的所有符号都是解析该可执行文件所需符号的候选符号,如果DYLD链接器绑定到意外符号,则会导致该库保持加载状态。您可以使用nm列出共享库中的符号,还可以设置环境变量以启用动态链接器的调试输出(请参阅dyld上的this手册页)。您需要设置DYLD_PRINT_BINDINGS环境变量。
最有可能的是,您需要将导出的符号限制为可执行文件使用的特定子集,以便只绑定您打算使用的那些符号。这可以通过将所需的符号放在文件中并通过-exported_symbols_list选项将其传递给链接器来完成。如果不这样做,您可能最终会在unload库中绑定一个符号,并且它不会被卸载,因为它们需要解析可执行文件中的符号,并且在调用dlclose()时不会卸载。
https://stackoverflow.com/questions/12936327
复制