iOS Link Map File
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 | 代码运行中包含的字符串常量, 例:
|
__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。懒加载的函数指针地址。 配合 |
__mod_init_func | 模块初始化的方法 |
__const | 存储constant常量的数据。比如使用 |
__cfstring | Core Foundation 字符串 |
__objc_classlist | OC类列表和类信息映射了 |
__objc_nlclslist | OC 的 +load 函数列表,比 |
__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 部分的顺序是和 Target -> Build Phase -> Compile Sources 的文件顺序一致的。
二进制重排
二进制重排 就是要重新排列这些 方法符号的顺序 ,中心思想就是把启动用到的代码挪到前面的位置加载!
以上是 iOS Link Map File 的全部内容, 来源链接: utcz.com/a/18432.html


