iOS Link Map File 文件說明

Link Map File 是什麼

Link Map File 直譯爲 連接映射文件,是 Xcode 生成可執行文件時一塊兒生成的文本,用於記錄連接相關信息。bash

  • 可執行文件的路徑
  • CPU架構
  • .o目標文路徑
  • 方法符號

Link Map File 有什麼用

  • 查看代碼加載順序
  • 理解內存分段分區
  • Crash 時經過 Symbols 定位源碼的機制
  • 分析可執行文件中類或庫體積,優化包體積

生成 Link Map File

Xcode 在生成可執行文件的時候默認狀況下不生成該文件。架構

Xcode的配置中 Target -> Build Setting -> LinkingWrite Link Map File設置爲YES來生成Link Map File,運行代碼便可生成Link Map File app

Linking下還能夠看到生成文件的路徑 iphone

經過這個路徑能夠訪問到函數

~/Developer/Xcode/DerivedData/項目/Build/Intermediates.noindex/項目.build/Debug-iphonesimulator/項目.build/項目-LinkMap-normal-x86_64.txt
複製代碼

還有一個簡便方法,在Products下找到.app文件,返回上層後根據路徑找到Link Map優化

查看 Link Map File

Link Map File主要分爲3個部分ui

  • 路徑部分,展現生成的相關文件路徑
  • Section部分,展現相關地址段
  • Symbols部分,方法符號段

路徑部分

  • Path.app文件路徑
  • Object files.o文件路徑

Section部分

Mach-O 文件中的虛擬地址最終會映射到物理地址上。這些地址被分紅不一樣的Segement__TEXT段、__DATA段、__LINKEDIT段。spa

  • __TEXT 包含 Mach header,被執行的代碼和只讀常量(如C 字符串),只讀可執行(r-x)。
  • __DATA 包含全局變量,靜態變量等,可讀寫(rw-)。
  • __LINKEDIT 包含了加載程序的元數據,好比函數的名稱和地址,只讀(r–)。

Segement 劃分紅了不一樣的 Section,不一樣的 Section 存儲着不一樣的信息,下面是一些經常使用的 Section 的介紹。ssr

__TEXT段中的 Section

字段 說明
__text 代碼節,存放機器編譯後的代碼
__stubs 用於輔助作動態連接代碼(dyld
__stub_helper 用於輔助作動態連接
__objc_methname objc的方法名稱
__stub_helper 用於輔助作動態連接
__cstring 代碼運行中包含的字符串常量,
例:#define kKey @"123",
123會存在這個區裏
__objc_classname 類名
__objc_methtype 方法類型
__ustring
__gcc_except_tab
__const 存儲const修飾的常量
__dof_RACSignal
__dof_RACCompou
__unwind_info

__DATA段中的 Section

字段 說明
__got 存儲引用符號的實際地址,相似於動態符號表
__la_symbol_ptr lazy symbol pointers。
懶加載的函數指針地址。
配合__stubsstub_helper使用。
__mod_init_func 模塊初始化的方法
__const 存儲constant常量的數據。
好比使用extern導出的const修飾的常量。
__cfstring Core Foundation 字符串
__objc_classlist OC類列表和類信息
映射了__objc_data的地址
__objc_nlclslist OC+load 函數列表,
__mod_init_func 更早執行
__objc_catlist categories
__objc_nlcatlist categories+load`函數列表
__objc_protolist 協議列表
__objc_imageinfo 鏡像信息
__objc_const OC常量。保存objc_classdata結構體數據。
用於映射類相關數據的地址,好比類名,方法名等
__objc_selrefs 引用的 OC 方法
__objc_protorefs 引用的 OC 協議
__objc_classrefs 引用的 OC
__objc_superrefs 引用的 OC超類
__objc_ivar ivar指針
__objc_data 用於保存類須要的數據。
最主要的內容是映射__objc_const地址,
找到類的相關數據。
__data 存放了協議和已經初始化的靜態量
__bss 存儲未初始化的靜態量
__common 存儲導出的全局的數據

Symbols 部分

  • Address:方法代碼的地址
  • Size:方法佔用的空間
  • File:文件的編號
  • Name.o文件裏面的方法符號

Symbols 部分的 File 順序是和 Target -> Build Phase -> Compile Sources 的文件順序一致的。3d

二進制重排

二進制重排 就是要從新排列這些 方法符號的順序 ,中心思想就是把啓動用到的代碼挪到前面的位置加載!

相關文章
相關標籤/搜索