在ios上调用dlopen

这是一个很受关注的话题,特别是最近的话题。 希望这不是一个骗局,因为我已经完成了所有其他的问题。

我对这是否合法不感兴趣。 虽然不能100%清楚你是否可以在iOS8上自由地使用dylib来做你想做的事情,但它似乎允许一些dynamic加载(例如, 你可以为iOS构builddynamic库并在运行时加载它们 )。

我所关心的只是制作dlopen作品(暂时忘记存储提交)! 我有一个非常基本的iOS例子,我手动做了一个dlopen,后面跟着一个dlsym来调用一个本地dylib中的函数。 这在模拟器上正常工作,但在设备上失败。 该设备是一个iPhone 4s运行(非越狱)的iOS 7.1.2。

AFAIK甚至在iOS 7上调用dlopen也是合法的,因为有明确的苹果指令来说明如何支持这个(请参阅“在iOS上部署一个包含应用程序的老版本” https://developer.apple.com/library/prerelease/ ios / documentation / General / Conceptual / ExtensibilityPG / ExtensionScenarios.html#// apple_ref / doc / uid / TP40014214-CH21-SW3 )。

我的猜测是根本原因是简单的,就像dylib在iOS不喜欢的二进制文件夹。 有没有人有这样的经验,知道限制是什么,或者可能知道我做错了什么。

仅供参考,我的加载代码是:

NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; NSString* dlPath = [NSString stringWithFormat: @"%@/frameworktest", resourcePath]; const char* cdlpath = [dlPath UTF8String]; void* hModule = dlopen(cdlpath, RTLD_LAZY); 

dylib(frameworktest)是通过创buildCocoa Touch Framework创build的,从构build的框架构build并获取dylib二进制文件并添加到项目资源(在根文件夹中)。 otool将dylib显示为一个armv7 dynmic库,目标是ios min 7.0版本。 我可以成功打开文件,所以我知道我正在寻找正确的文件夹。

我可以深入到dlopen大会。 到目前为止,事实上,它变得毫无信息寻找明显的失败:)

有任何想法吗?

在打电话给dlopen之后检查errno我看到EPERM(我猜不是一个大惊喜)。

我已经添加了一个codeign阶段的构build,以明确签署dylib,现在它的作品。

一些额外的信息:有趣的是,应用程序的标志阶段默认运行在整个.app包,而不仅仅是主要的应用程序二进制文件(从来没有仔细看过)。 所以有人可能会期望这也签署了dylib。 实际上,当我的自定义阶段运行密码报告“replace现有的签名”。 但是,这可能来自框架的原始构build。 我检查了该项目的阶段和框架也签署(再次,不只是dylib,但整个框架传递给编码)。 符号参数是相同的。 所以沿着这条线索,dylib得到了不正确的签名。 如果有任何有趣的信息,我会在一些点更详细的调查,并回来。 我的猜测是我通过手动创build,提取和打包dylib来打破系统!

感谢@jww和@duskwuff的build议!