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
二进制重排 就是要从新排列这些 方法符号的顺序 ,中心思想就是把启动用到的代码挪到前面的位置加载!