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_methnameobjc的方法名称
__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_ptrlazy symbol pointers。

懒加载的函数指针地址。

配合__stubsstub_helper使用。

__mod_init_func模块初始化的方法
__const存储constant常量的数据。

比如使用extern导出的const修饰的常量。

__cfstringCore Foundation 字符串
__objc_classlistOC类列表和类信息

映射了__objc_data的地址

__objc_nlclslistOC+load 函数列表,

__mod_init_func 更早执行

__objc_catlistcategories
__objc_nlcatlistcategories+load`函数列表
__objc_protolist协议列表
__objc_imageinfo镜像信息
__objc_constOC常量。保存objc_classdata结构体数据。

用于映射类相关数据的地址,比如类名,方法名等

__objc_selrefs引用的 OC 方法
__objc_protorefs引用的 OC 协议
__objc_classrefs引用的 OC
__objc_superrefs引用的 OC超类
__objc_ivarivar指针
__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

回到顶部