您的位置:首页 > 其它

程序在低于3gs以下崩溃 原因解析和程序调用过程

2011-06-17 20:49 211 查看
现象描述:

程序起来直接崩溃

错误log信息:



错误原因:

引入的库的编译版本的选项和工程的不一致 比如

编译选项1




编译选项2


上面选择编译的选项不一致导致 选择standar armv6指令编译的程序支持 3gs硬件以下的版本 但是库选择 optimized(armv7)编译的库在工程中编译生成的可执行程序 只支持在 3gs以上的硬件版本(因为 3gs以上的硬件已经使用armv7指令)

**********************************

原因查找分析步骤

****************************************

1、

刚开始碰到这个问题的时候首先反应是不是又是高低版本编译在不同机子类型出现的错误,所以直接在终端那边执行

比如 ./xxx (要是是framework引用出错的话就会在运行后提示相关的framework的问题描述)

另外还可以安装otool(在 cydia Link Indenty Editor,安装完成后默认路径问/usr/bin)并且在终端直接执行如 otool -L xxx(执行文件)来获得可执行文件所依赖的共享库列表

但是以上显示跟frameWork都没有问题

2、

然后查看crash log

根据如图3所示程序崩溃最后执行的位置在ImageLoaderMacho::doInitialization()这个函数,根本还没有进入程序的调用,所以猜想可能还是在加载动态库的时候崩溃掉的。

因为在链接生成可执行程序的时候,有动态链接工程中的动态库,动态库的特性就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行。

这样就慢慢的对工程中的链接动态库的地方慢慢的删除,然而不幸的是编译生成的可执行程序还是不能在真机上面运行。

****************对以上一些信息解释*******************

根据错误ImageLoaderMacho

Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件,目标代码,动态库,内核转储的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性,并提升了符号表中信息的访问速度。

Mach-O曾经为大部分基于Mach(微型操作系统,mac os也是使用mach后派生系统)核心的操作系统所使用。
http://zh.wikipedia.org/wiki/Mach-O
Dyld

Mac OS X在初始发布时即支持多种运行环境,现在活跃工程的环境是Dyld环境。其它环境仅用于Mac OS 9到Mac OS X的移植。 Dyld环境是读取,链接,执行Mach-O文件的本地Mac OS X环境。其核心是称为dyld的动态加载器(dynamic loader)。它处理了程序和动态库的读取,解析库和模组的依赖,并执行程序。

在读取程序代码模块时,动态加载器执行最小的符号绑定,以执行你的程序。绑定过程包括解析外部的程序库并在使用它们是被加载。符号是强链接或弱链接的。它们的区别在于,强链接当找不到程序库中符号或找不到程序库时终止程序。弱链接则在使用符号不存在并要使用是终止程序。

3、

由于删除完动态库以后还是不能起来程序,应该是静态链接的时候出错 (在加上好像从3gs开始编译使用的armv 编译指令浮号从 armv6--->armv7升级)这样会不会静态库编译成armv7造成的原因导致。

原来如此 对程序中有用到的静态库进行重新编译以后果然可能支持 3gs和touch2代以下硬件了

**************************************************************************

由以上的一些现象总结出iphone程序编译运行的整个过程

首先xcode

预编译: 这个过程处理宏定义和include,并做语法检查。

编译: 生成汇编代码

汇编: 生成目标代码

链接过程: 生成可执行代码. 链接分为静态和动态链接,

其中

静态链接就是在链接的时候链接器(dyld)将静态库的内容加入到可执行程序中.(这样的缺点就是生成的可执行程序太大在装入内存的时候消耗更多时间)

动态链接就是等到程序运行的时候才对那些目标文件进行链接。

当程序在mac os上面生成可执行程序 如X 以后放到iphone上运行过程

首先在进入 X 的main函数之前程序

动态加载器 Dyld就会去加载程序链接的动态库和程序运行所需的动态库等,还会去读取frameWork是弱链接还是强链接等信息,弱是强链接当找不到程序库中符号或找不到程序库时终止程序。弱链接则在使用符号不存在并要使用是终止程序。

加载这些外部共享库等信息完成以后就进入程序的main函数调用阶段。

**************************************************************

因为mac os 编译的可执行程序都是Macn-o文件类型

如果对可执行程序文件组织结构更深入的了解可以参照
http://2009fly.com/index/a/yidongkaifa/iPhone/rumen/iPhonegaoji/2011/0228/603.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: