現象描述:
程式起來直接崩潰
錯誤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