ios应用加载第三方动态库dylib时崩溃及解决办法

来源:互联网 发布:不想上班 知乎 编辑:程序博客网 时间:2024/05/29 21:28

        最近在开发一个App需要以root权限运行,其中用到一个第三方合作开发的动态库。用theos创建工程,编译,打包,安装都没有问题,但是在手机上点击运行的时候崩溃,崩溃日志如下:

{"bundleID":"com.yourcompany.packetcapturedemo001","app_name":"PacketCaptureDemo001","share_with_app_devs":false,"name":"PacketCaptureDemo001","app_version":"","is_first_party":true,"os_version":"iPhone OS 8.1.2 (12B440)","bug_type":"109","slice_uuid":"15567a86-44d4-32ec-b89e-e5c173a3b876","build_version":"1.0","adam_id":0}Incident Identifier: 6FC414F6-191C-4A20-ACA5-689298F9E918CrashReporter Key:   dcaf417a1be906ffdddba183c4131cf8a35d8c64Hardware Model:      iPhone5,2Process:             PacketCaptureDemo001 [1039]Path:                /private/var/db/stash/_.pDSZup/Applications/PacketCaptureDemo001.app/PacketCaptureDemo001Identifier:          com.yourcompany.packetcapturedemo001Version:             1.0Code Type:           ARM (Native)Parent Process:      launchd [1]Date/Time:           2015-03-17 16:41:51.594 +0800Launch Time:         2015-03-17 16:41:51.237 +0800OS Version:          iOS 8.1.2 (12B440)Report Version:      105Exception Type:  EXC_BREAKPOINT (SIGTRAP)Exception Codes: 0x0000000000000001, 0x00000000e7ffdefeTriggered by Thread:  0Dyld Error Message:  Library not loaded: libmt.dylib  Referenced from: /private/var/db/stash/_.pDSZup/Applications/PacketCaptureDemo001.app/PacketCaptureDemo001  Reason: unsafe use of relative rpath libmt.dylib in /private/var/db/stash/_.pDSZup/Applications/PacketCaptureDemo001.app/PacketCaptureDemo001 with restricted binary  Dyld Version: 353.6Binary Images:0x1fe67000 - 0x1fe8afff dyld armv7s  <8ffd813a380c333bbd4a25e1dbe05715> /usr/lib/dyld0x248e0000 - 0x24c0dfff CoreFoundation armv7s  <5b54383b963a36369b45eaa35c3940be> /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation0x24c0e000 - 0x24d38fff CoreGraphics armv7s  <7f8833bf31b33242b32bb893c5832f42> /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics0x25626000 - 0x25828fff Foundation armv7s  <6763b485b3b530f5ae7a6b8732110736> /System/Library/Frameworks/Foundation.framework/Foundation0x27e9a000 - 0x2873cfff UIKit armv7s  <94d79df43f8a3b519b7fbf2ca102b4ea> /System/Library/Frameworks/UIKit.framework/UIKit0x32196000 - 0x32390fff libobjc.A.dylib armv7s  <2f24d570e8253da29e77c4104a66ffff> /usr/lib/libobjc.A.dylib
        用otool -L DYLIB_NAME命令对比这个动态库和其他库,如下:

        出错的库:

libmt.dylib:        libmt.dylib (compatibility version 0.0.0, current version 0.0.0)        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1214.5.1)    ... ...


        正常的库:

libtest.dylib:        /usr/lib/libtest.dylib (compatibility version 0.0.0, current version 0.0.0)        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1214.5.1)    ... ...
        可见是库文件查找路径的问题,google查阅一番后,可通过install_name_tool命令修改库的查找路径,具体做法如下:

install_name_tool -id /usr/lib/libmt.dylib libmt.dylib
        再用otool -L libmt.dylib查看文件信息,如下:

libmt.dylib:        /usr/lib/libmt.dylib (compatibility version 0.0.0, current version 0.0.0)        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1214.5.1)    ... ...
        用此修改过的库文件替换原来的库文件,重新编译打包安装后,就可以直接运行了。

        

        附:如果不赋予这个App系统用户的权限,则不需要做上述修改就能正常运行,不知道这是为什么?还得进一步挖掘...


        参考链接:http://qin.laya.com/tech_coding_help/dylib_linking.html
                          http://bbs.csdn.net/topics/350155746




0 0