iOS APP可執行文件的組成

ipa包主要由三大部分構成:

1、可執行文件;2、Asset.car 文件(asset 文件夾中圖片的壓縮文件);3、其他:_CodeSignature文件夾,簽名信息。


Unix 可執行文件-20.8 MB
  • 使用 file 命令查看這個可執行文件:這是個 Mach-O 文件類型,里面包含了兩個架構:armv7&arm64。file DingTalk
  • 使用otool查看Mach-O文件:otool -h DingTalk。使用反匯編工具對執行文件進行反匯編可以對Mach-O文件有一個直觀的認識。

Mach-O:

Mach-OMach Object 文件格式的縮寫,它是一種用于可執行文件目標代碼動態庫,內核轉儲的文件格式。
是iOS/Mac OS上存儲程序以及庫的標準格式。

  • 常見的Mach-O格式的文件
    • MH_OBJECT 目標文件: .o .a/ .framework靜態庫,靜態庫即多個.o文件存放在一起實現特定的功能。
    • MH_EXECUTE 可執行文件:.app/MyApp .out
    • MH_DYLIB 動態庫:.framework/xxx /dylib
    • MH_DYLINKER 動態鏈接器: usr/lib/dyld
    • MH_DSYM 存儲二進制文件符號信息的文件:.dYSM/Contents/Resources/DWARF/MyApp
  • Mach-O文件的基本結構
    • 頭部(header structure):文件類型, 目標架構。
    • 加載命令(load command):描述文件在虛擬內存中的邏輯與布局。
    • 段(segment)。可以擁有多個段(segment),每個段可以擁有零個或多個區域(section)。每一個段(segment)都擁有一段虛擬地址映射到進程的地址空間。加載命令中定義的原始數據。
    • 鏈接信息。一個完整的用戶級 Mach-o 文件的末端是鏈接信息。其中包含了動態加載器用來鏈接可執行文件或者依賴庫所需使用的符號表、字符串表等等。
  • 分析Mach-O結構

Mach Header(arm64)
Magic Number : 魔數, 表示支持設備的CPU位數(oxFEEDFACE : 表示32位二進制、oxFEEDFACF : 表示64位二進制)
cputype和 cpusubtype: CPU類型和子類型
filetype : Mach-O文件類型
ncmds 和 sizeofcmds: 用于加載器的 加載命令的條數和大小
flags : 動態鏈接器dyld的標志

基本的編譯過程分為四個步驟:

  1. 預處理(Pre-process):把宏替換,刪除注釋,展開頭文件,產生 .i 文件。
  2. 編譯(Compliling):使用預處理后的單詞構建詞法樹,生成語法樹輸出 AST(Abstract Syntax Tree),將 AST 轉化為更低級的中間碼(LLVM IR),優化中間代碼生成輸出匯編代碼,把之前的 .i 文件轉換為匯編語言,產生 .s 文件。
  3. 匯編(Asembly):把匯編語言文件轉換為機器碼文件,產生 .o 文件。
  4. 鏈接(Link):對 .o 文件中的對于其他的庫的引用的地方進行引用,生成最后的可執行文件(同時也包括多個.o文件進行 link)。

LinkMap

LinkMap中存放的是app可執行文件Mach-O格式組織的各類數據的清單,根據LinkMap展開對Mach-O文件及dyld加載Mach-O可執行文件的細節;
LinkMap文件是xcode link時產生的中間文件,一般用于調試,可以精確知道某個地址對應的函數。
iOS APP編譯后,除了一些資源文件,剩下的就是一個可執行文件。

1.XCode開啟編譯選項Write Link Map File
2.編譯后,到編譯目錄里找到該txt文件,文件名和路徑就是上述的Path to Link Map File
這個LinkMap里展示了整個可執行文件的全貌,列出了編譯后的每一個.o目標文件的信息(包括靜態鏈接庫.a里的),以及每一個目標文件的代碼段,數據段存儲詳情。

1
目標文件列表,中括號里的是這個文件的編號。
2
段表:首列是數據在文件的偏移位置,第二列是這一段占用大小,第三列是段類型,代碼段和數據段,第四列是段名稱。第一行位置+大小 = 第二行位置。
__text表示編譯后的程序執行語句
__data表示已初始化的全局變量和局部靜態變量
__bss表示未初始化的全局變量和局部靜態變量
__cstring表示代碼里的字符串常量
以下是__TEXT段的section
__text 主程序代碼
__stubs 和__stub_helper 用于動態鏈接庫的stub
__cstring c語言字符串
__const const修飾的常量
__objc_methname objc的方法名稱
__objc_methtype objc方法類型
__objc_classname objc類方法

以下是__DATA段的section
__objc_ivars objc類的實例變量
__objc_classlist objc類列表
__objc_protolist objc協議列表
__objc_imageinfo objc鏡像信息
__objc_const objc常量
__objc_selfrefs objc自引用(self)
__objc_protorefs objc協議引用
__objc_superrefs objc超類引用
__cfstring 使用Core Foundation字符串
__bss BSS

3
接著就是按上表順序,列出具體的按每個文件列出每個對應字段的位置和占用空間。
首列是數據在文件的偏移地址,第二列是占用大小,第三列是所屬文件序號,對應上述Object files列表,最后是名字。

4
// 已廢棄&多余重復的字段
# Dead Stripped Symbols:
自動分析LinkMapParser

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容