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