iOS Link Map File说明

Link Map File

Link Map File 直译为 链接映射文件,是 Xcode 生成可执行文件时一起生成的文本,用于记录链接相关信息:
1.可执行文件的路径
2.CPU架构
3..o目标文路径
4.方法符号

有什么用?
1.查看代码加载顺序
2.理解内存分段分区
3.Crash 时通过 Symbols 定位源码的机制
4.分析可执行文件中类或库体积,优化包体积

生成 Link Map File
生成 Link Map File.png

可以通过这个路径访问Link Map File

$ open ~/Library/Developer/Xcode/DerivedData/项目名-drvxyokcnmitfbabaqkqkssshdai/Build/Intermediates.noindex/项目名.build/Release-iphoneos/项目名.build/项目名-LinkMap-normal-arm64.txt

快速访问

image.png
image.png
image.png
image.png
查看 Link Map File

Link Map File主要分为3个部分:
1.路径部分,展示生成的相关文件路径
2.Section部分,展示相关地址段
3.Symbols部分,方法符号段

1.路径部分
Path是.app文件路径
Object files是.o文件路径

路径部分.png

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

Section部分.png

Segement 划分成了不同的 Section,不同的 Section 存储着不同的信息,下面是一些常用的 Section 的介绍。

字段说明:
__TEXT段中的 Section

// 代码节,存放机器编译后的代码
__text   
// 用于辅助做动态链接代码(dyld)
__stubs
// 用于辅助做动态链接
__stub_helper
// objc的方法名称
__objc_methname
// 用于辅助做动态链接
__stub_helper
// 代码运行中包含的字符串常量
// 例:#define kKey @"123",     123会存在这个区里
__cstring
// 类名
__objc_classname
// 方法类型
__objc_methtype

__ustring

__gcc_except_tab
// 存储const修饰的常量
__const

__dof_RACSignal

__dof_RACCompou

__unwind_info

__DATA段中的 Section

// 存储引用符号的实际地址,类似于动态符号表
__got
// lazy symbol pointers。懒加载的函数指针地址。                                          // 配合__stubs和stub_helper使用。
__la_symbol_ptr
// 模块初始化的方法
__mod_init_func
// 存储constant常量的数据。
// 比如使用extern导出的const修饰的常量
__const
// Core Foundation 字符串
__cfstring
// OC类列表和类信息;映射了__objc_data的地址
__objc_classlist
// OC 的 +load 函数列表,比__mod_init_func 更早执行
__objc_nlclslist
// categories
__objc_catlist
// categories的+load`函数列表
__objc_nlcatlist
// 协议列表
__objc_protolist
// 镜像信息
__objc_imageinfo
// OC常量。保存objc_classdata结构体数据。 用于映射类相关数据的地址
// 比如类名,方法名等
__objc_const
// 引用的 OC 方法
__objc_selrefs
// 引用的 OC 协议
__objc_protorefs
// 引用的 OC 类
__objc_classrefs
// 引用的 OC超类
__objc_superrefs
// ivar指针
__objc_ivar
// 用于保存类需要的数据。
// 最主要的内容是映射__objc_const地址,找到类的相关数据。
__objc_data
// 存放了协议和已经初始化的静态量
__data
// 存储未初始化的静态量
__bss
// 存储导出的全局的数据
__common

3.Symbols 部分
Address:方法代码的地址
Size:方法占用的空间
File:文件的编号
Name:.o文件里面的方法符号

Symbols 部分.png

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

二进制重排
二进制重排 就是要重新排列这些 方法符号的顺序
中心思想就是把启动用到的代码挪到前面的位置加载!

你可能感兴趣的:(iOS Link Map File说明)