IOS运行报错 "dyld: Library not loaded" 原因分析

我们的游戏IOS版在接入易接SDK后,启动出现如下错误

dyld: Library not loaded: @rpath/OnlineAHelper.framework/OnlineAHelper
  Referenced from: /var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/yzg
  Reason: no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22 at address=0x0349E000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper
    /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22 at address=0x034C6000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper
 
里面给出了一些解决方法,包括清理缓存数据、重新安装证书等等。一开始我把这些方法几乎都尝试了一遍,但还是没有解决问题。
 
重新分析问题时,怀疑会不会是编译目标的CPU架构问题。我的测试机子是iPhone5s + iOS 9.2,编译目标架构选择了armv7 
用file命令查看易接的库内容显示其包含了armv7和arm64两个版本。iPhone5s是arm64架构的CPU,于是重新编译选择了arm64,问题顺利解决。
 
错误原因:
32位的库在加载到64位的机子的iOS9系统后,32位的pagesize由之前的4096字节变成了16384字节,从而导致32位的APP加载的动态库不能在64位机子运行。
 
解决的方法有两种:
1.在动态库的工程中的other linker flags中加入
-Wl,-segalign,4000
2.将APP升级到支持arm64架构(这也是我们现在的做法)
 

 

 

posted @ 2018-07-06 10:36  doublerain  阅读(1411)  评论(0编辑  收藏  举报