gpt4 book ai didi

objective-c - 卸载动态库需要两次 dlclose() 调用?

转载 作者:太空狗 更新时间:2023-10-30 03:27:18 26 4
gpt4 key购买 nike

我有一个动态库,我使用 dlopen() 加载它,然后使用 dlclose() 卸载它;

如果我不包含任何 objective-c 代码,dlopen() 需要一个 dlclose() 调用,这是预期的行为。但是当我包含任何 objective-c 代码作为目标时,我遇到了问题,我需要对加载的库执行两次 dlclose() 调用才能卸载。

这是预期的行为吗?我该如何解决?

最佳答案

我知道您使用的是 dlopen,而不是 CFBundleNSBundle。尽管如此, Code Loading Programming Topics 手册是这样说的:

In Cocoa applications, you should not use CFBundle routines to load and unload executable code, because CFBundle does not natively support the Objective-C runtime. NSBundle correctly loads Objective-C symbols into the runtime system, but there is no way to unload Cocoa bundles once loaded due to a runtime limitation.

还有这个:

Because of a limitation in the Objective-C runtime system, NSBundle cannot unload executable code.

这让我怀疑当您加载您的库时,它会向 Objective-C 运行时注册自己,并且运行时会再次调用库上的 dlopen(或者以某种方式增加库的引用计数)。

我搜索了 Objective-C 运行时源代码并找到了 this :

// dylibs are not allowed to unload
// ...except those with image_info and nothing else (5359412)
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) {
dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD);
}

是的,Objective-C 运行时正在对您的库调用 dlopen 以防止它被卸载。如果您作弊并调用 dlclose 两次,您应该预料到会发生不好的事情。

关于objective-c - 卸载动态库需要两次 dlclose() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com