Link Map File,译作链接映射文件(下文将称 Link Map 文件)。在构建可执行文件之前,需要先编译为目标文件(Object File),并链接所需要的其他库,那么 Link Map 文件就记录了链接器(Linker)在链接过程中产生的一些信息,本文将谈谈这个文件的构成。
What
Xcode 中默认是不会将 Link Map 文件在构建时暴露出来的,需要我们手动在「Build Settings」-「Write Link Map File」-「Yes」打开该写入该文件的设置。这样当我们再次编译项目,默认就可以在 ~/Library/Developer/Xcode/DerivedData/<TARGET_NAME>-<Random_ID>/Build/Intermediates.noindex/<TARGET_NAME>.build/Debug-<Device_Type>/<TARGET_NAME>.build/<TARGET_NAME>-LinkMap-normal-<Arch>.txt 中找到。如有更改 Link Map 文件路径的需求也可以在「Path to Link Map File」中更改。
举个例子,我的 DemoiOS 项目中 Link Map 文件的完整路径为:/Users/kingcos/Library/Developer/Xcode/DerivedData/DemoiOS-hifhuapijabsaxgpelrpiwhbzlqv/Build/Intermediates.noindex/DemoiOS.build/Debug-iphonesimulator/DemoiOS.build/DemoiOS-LinkMap-normal-x86_64.txt。
Preface
Link Map File,译作链接映射文件(下文将称 Link Map 文件)。在构建可执行文件之前,需要先编译为目标文件(Object File),并链接所需要的其他库,那么 Link Map 文件就记录了链接器(Linker)在链接过程中产生的一些信息,本文将谈谈这个文件的构成。
What
Xcode 中默认是不会将 Link Map 文件在构建时暴露出来的,需要我们手动在「Build Settings」-「Write Link Map File」-「Yes」打开该写入该文件的设置。这样当我们再次编译项目,默认就可以在
~/Library/Developer/Xcode/DerivedData/<TARGET_NAME>-<Random_ID>/Build/Intermediates.noindex/<TARGET_NAME>.build/Debug-<Device_Type>/<TARGET_NAME>.build/<TARGET_NAME>-LinkMap-normal-<Arch>.txt
中找到。如有更改 Link Map 文件路径的需求也可以在「Path to Link Map File」中更改。举个例子,我的 DemoiOS 项目中 Link Map 文件的完整路径为:
/Users/kingcos/Library/Developer/Xcode/DerivedData/DemoiOS-hifhuapijabsaxgpelrpiwhbzlqv/Build/Intermediates.noindex/DemoiOS.build/Debug-iphonesimulator/DemoiOS.build/DemoiOS-LinkMap-normal-x86_64.txt
。How
下面来分析一下 Link Map 文件的构成。
Path
Path 为最终生成「可执行文件」的路径。
Arch
Arch 为「可执行文件」的架构,具体架构与设备的对照可参考下表:
Object files
Object files 为「目标文件」,该部分列出了所有的目标文件、记录系统动态库信息的文件等,其中第一列为序号,也对应了下面「Symbols」部分中的「File」一列。
application-identifier
和keychain-access-groups
,但该行仅在模拟器作为构建目标时存在。Sections
Sections 中主要描述了节(Section)相关的信息,分为四列:内存地址、大小、段(Segment)、节。每一行的地址为上一行初始地址 + 内存大小(+ 偏移量)。
__TEXT
和__DATA
标示了段信息,并各自对应多个节信息。__TEXT
为只读代码段,存储了可执行的代码信息,__DATA
为数据段,存储了可读写但不可执行的数据。关于此处更为详细的信息,之后将在「Mach-O」专题中讲述。Symbols
Symbols 中为符号(Symbol)相关的信息,分为四列:内存地址、大小、文件(序号对应 Object files 中的文件)、符号名称。通过结合「Sections」部分可以得知每一节的具体符号内容,并可以计算某个类或文件编译后的大小,帮助我们分析包体积。
Dead Stripped Symbols
Dead Stripped Symbols 也是和上面结构一致的符号表,但「Dead」意味着表里的符号已经不再存在,因此没有记录内存地址。
Reference