我有一个正在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.so
为Mach-O 64-bit bundle
。
我有两个问题:
"找不到合适的图片"和" mmap()错误1"错误消息意味着什
如何更正(甚至诊断)此处发生的事情?我已逐步完成C代码,dlopen()
调用失败,返回值为NULL
,并设置了错误消息,因此单步执行代码并不会再给我一些信息。
(作为背景, - 我试图将Python移植到iOS;对dlopen()
的调用用于加载本机代码模块。time.so
是其中一个模块。)
答案 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;这将显示系统调用失败的原因。