1

我正在使用一个胖静态库,它使用 dlopen() 在静态库中加载内部模块(.so) 文件。在 stackoverflow 上,开发人员说 dlopen() 是一个私有 API。

在这种情况下,可以使用 dlopen() 或作为私有 API,无论库性质如何,它都不应该在用户库中使用,即静态/动态。

如果我不能使用 dlopen() 那么有人可以指向任何资源以替代方法来完成相同的任务。

注意:这是关于 baresip BSD 库。( http://www.creytiv.com/ )

更新:该库首先尝试静态加载所有配置的模块,如果失败,则尝试使用 dlopen() 动态加载它们。所以删除动态加载代码将解决我的问题。

4

2 回答 2

1

dlopen在 iOS 版本 < iOS 8 上是不允许的。请参见此处

于 2014-05-29T11:11:09.197 回答
0

使用dlopen文字参数一直没问题。

dlopen 已记录在案,因此它不是私有 API。只需输入man dlopen您的终端,或查看应用程序扩展编程指南 >处理常见场景,或动态库使用指南 > 1 , 2

如果您尝试使用dlopen由您签名但未包含在已审核应用程序中的代码,则您违反了应用程序审核指南 2.5.2

2.5.2 应用程序应在其捆绑包中自包含,不得在指定容器区域外读取或写入数据,也不得下载、安装或执行代码,包括其他应用程序。

你可能会收到这样的消息:

您的应用程序、扩展程序和/或链接框架似乎包含明确设计的代码,能够在应用程序审核批准后更改您的应用程序的行为或功能,这不符合 App Store 审核指南 2.5.2 和第 3.3.2 节Apple 开发者计划许可协议。

与最初为 App Store 审查时相比,此代码与远程资源相结合,可以促进对应用行为的重大更改。虽然您目前可能没有使用此功能,但它有可能加载私有框架、私有方法并启用未来的功能更改。这包括任何将任意参数传递给动态方法的代码,例如 dlopen()、dlsym()、responsToSelector:、performSelector:、method_exchangeImplementations(),以及运行远程脚本以更改应用程序行为和/或调用 SPI,基于下载脚本的内容。即使远程资源不是故意恶意的,它也很容易被中间人 (MiTM) 攻击劫持,这可能会给应用程序的用户带来严重的安全漏洞。

于 2018-03-31T15:45:10.197 回答