在iOS上,dlopen是否有重新加载dylib文件的方法?

8

正如标题所说...我对dlopen()很感兴趣。我知道这在应用商店是不允许的,但我对iOS上的这个很好奇。

我的问题是,我可以创建一个.dylib文件,并使用以下代码在运行时加载此文件:

char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
    NSString * (*someMethod)() = dlsym(libHandle, "someMethod");
    if (someMethod != NULL)  {
        NSLog(someMethod());
    }
    dlclose(libHandle);
}

以下内容摘自此处

我遇到的问题是,如果我更改了 mydylib2.dylibdlopen 就不会加载重新编译的 .dylib 文件。相反,它会解析函数 someMethod 的旧版本。

例如,如果 someMethod 最初返回 @"Hello",而我将其更改为 @"Hello World" 并重新编译,则上述代码将始终返回 @"Hello",直到我在模拟器中重新启动应用程序。

有人知道为什么会这样吗?并提供一个解决方案,以便在运行时重新加载此 .dylib 吗?


你有没有找到解决办法? - newenglander
1个回答

1

查看dlcloseman page,似乎有几个原因导致库无法卸载。

有几种情况下动态库永远不会被卸载:1)主可执行文件链接到它,2)使用不支持卸载的API(例如NSAddImage())加载它或者依赖于它的其他动态库,3)动态库在dyld的共享缓存中。

我怀疑你的问题是“dyld共享缓存”。你可以尝试运行:

sudo update_dyld_shared_cache -force

在您替换库之后(不确定iOS是否支持此功能)。

您是否已经检查了dlclose的返回值,以查看它是成功还是失败?


在iOS中似乎没有update_dyld_shared_cache命令(在Cydia中也找不到)。 - newenglander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接