You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered: