Link Map File 是什么
Link Map File
直译为 链接映射文件,是 Xcode
生成可执行文件时一起生成的文本,用于记录链接相关信息。
- 可执行文件的路径
CPU
架构.o
目标文路径- 方法符号
Link Map File 有什么用
- 查看代码加载顺序
- 理解内存分段分区
Crash
时通过Symbols
定位源码的机制- 分析可执行文件中类或库体积,优化包体积
生成 Link Map File
Xcode
在生成可执行文件的时候默认情况下不生成该文件。
在Xcode
的配置中 Target -> Build Setting -> Linking
将Write Link Map File
设置为YES
来生成Link Map File
,运行代码即可生成Link Map File

Linking
下还可以看到生成文件的路径

通过这个路径可以访问到
~/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个部分
- 路径部分,展示生成的相关文件路径
Section
部分,展示相关地址段Symbols
部分,方法符号段
路径部分
Path
是.app
文件路径Object files
是.o
文件路径

Section
部分
Mach-O
文件中的虚拟地址最终会映射到物理地址上。这些地址被分成不同的Segement
: __TEXT
段、__DATA
段、__LINKEDIT
段。
__TEXT
包含Mach header
,被执行的代码和只读常量(如C
字符串),只读可执行(r-x
)。__DATA
包含全局变量,静态变量等,可读写(rw-
)。__LINKEDIT
包含了加载程序的元数据,比如函数的名称和地址,只读(r–
)。

Segement
划分成了不同的 Section
,不同的 Section
存储着不同的信息,下面是一些常用的 Section
的介绍。
__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
的文件顺序一致的。
二进制重排
二进制重排 就是要重新排列这些 方法符号的顺序 ,中心思想就是把启动用到的代码挪到前面的位置加载!