如何在iOS设备上诊断dlopen()中的故障

时间:2015-02-27 15:50:36

标签: ios c dlopen

我有一个正在iOS应用中使用的C库。此库使用dlopen()来访问扩展功能。代码在iOS模拟器上工作正常(在32位和64位模式下);但是,当我在实际的iPhone5s(ARM64)上运行相同的代码时,我收到以下错误:

dlopen(/private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so, 2): no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so: mmap() error 1 at address=0x101CE4000, size=0x00004000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/EDEAE282-AE96-45CA-9A4F-D70EE532FB93/foobar.app/lib/time.so

据我所知,该文件存在且成功找到。它不仅仅是为错误的架构编译的问题; lipo -info报告time.so

Non-fat file: time.so is architecture: arm64

file报告time.soMach-O 64-bit bundle

我有两个问题:

  1. "找不到合适的图片"和" mmap()错误1"错误消息意味着什

  2. 如何更正(甚至诊断)此处发生的事情?我已逐步完成C代码,dlopen()调用失败,返回值为NULL,并设置了错误消息,因此单步执行代码并不会再给我一些信息。

  3. (作为背景, - 我试图将Python移植到iOS;对dlopen()的调用用于加载本机代码模块。time.so是其中一个模块。)

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。当我dlopen一个框架时,Xcode会说dlopen mmap() error 1

确保您使用相同的身份对框架和托管应用程序进行了烧录。

答案 1 :(得分:0)

问题1:"找不到合适的图像

<强> [答案] 您是否尝试设置导出LD_LIBRARY_PATH或设置-rpath而不是

问题2:&#34; mmap()错误1&#34;错误消息意味着。

<强> [答案]

一种可能性: 基本上,关键点dlopen的作用是建立磁盘文件库与系统RAM之间的内存映射。

  

&#34;地址= 0x101CE4000处的mmap()错误1,大小= 0x00004000&#34;

表示操作系统会将文件映射到虚拟内存地址0x101CE4000(页面对齐),大小为4页(16384字节)。

因为这样的尝试失败了,我怀疑你的系统ram中的空闲内存是否足以进行映射。

另一种可能性:

dlopen中使用的mmap可能使用MAP_FIXED标志来执行映射,因此最终可能会出现内核选择要进行mmaped的虚拟地址但其属性不可执行的情况。

来自mmap中的手册页:

&#34; prot参数要求PROT_EXEC,但映射区域属于安装了no-exec的文件系统上的文件。&#34;

如果您可以更改dlopen()文件,只需删除MAP_FIXED标志(如果有)。

总而言之,了解通过mmap()设置的错误值(不是返回值)很有趣。你可以使用&#34; strace&#34;这将显示系统调用失败的原因。