有没有办法让dlopen在iOS上重新加载dylib文件?

时间:2012-09-29 13:38:26

标签: ios dylib dlopen

正如标题所说......我对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);
}

这取自here

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

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

有谁知道为什么会这样?并建议一个解决方法,以便可以在运行时重新加载此.dylib?

1 个答案:

答案 0 :(得分:0)

查看dlclose的{​​{3}},看起来有几个原因导致库无法卸载。

  

有几种情况下动态库永远不会出现   卸载:1)主要的可执行文件链接,2)一个API   没有supoort卸载(例如NSAddImage())用于加载它或一些   依赖于它的其他动态库,3)动态库是   在dyld的共享缓存中。

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

sudo update_dyld_shared_cache -force

更换库后(不知道iOS上是否可用)。

您是否检查了dlclose的返回值,看它是否成功?