5

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

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

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

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

感谢您在这方面的任何帮助!

谢谢,扬

4

1 回答 1

4

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

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

于 2012-11-15T18:22:54.290 回答