Link Map File
直譯爲 連接映射文件,是 Xcode
生成可執行文件時一塊兒生成的文本,用於記錄連接相關信息。bash
CPU
架構.o
目標文路徑Crash
時經過 Symbols
定位源碼的機制Xcode
在生成可執行文件的時候默認狀況下不生成該文件。架構
在Xcode
的配置中 Target -> Build Setting -> Linking
將Write 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
主要分爲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。 懶加載的函數指針地址。 配合 __stubs 和stub_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
二進制重排 就是要從新排列這些 方法符號的順序 ,中心思想就是把啓動用到的代碼挪到前面的位置加載!