Link Map File - ShenYj/ShenYj.github.io GitHub Wiki

Link Map File

Xcode 通过设置可以生成Link Map File帮助我们查看二进制符号顺序

开启方式:

Build Setting -> Path to Link Map File -> Write Link Map File 设置为YES

使用 clang对应参数为 -Xlinker -map -Xlinker ${PATH}

生成 Link Map File 文件路径:

.

在Symbols下便是, 这里还包含了其他mach-O信息 e.g.

# Symbols:
# Address	Size    	File  Name
0x100004450	0x000000AC	[  2] -[OCClass init]
0x100004500	0x00000070	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvpACTK
0x100004570	0x000000A0	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvpACTk
0x100004610	0x00000120	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvg
0x100004730	0x00000200	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvgAFyXEfU_
0x100004930	0x00000030	[  3] _$sSo8UIButtonCABycfC
0x100004960	0x00000040	[  3] _$ss27_finalizeUninitializedArrayySayxGABnlF
0x1000049A0	0x00000090	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvs
0x100004A30	0x00000040	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvM
0x100004A70	0x00000060	[  3] _$s7SPMDemo14ViewControllerC6buttonSo8UIButtonCvM.resume.0
0x100004AD0	0x00000010	[  3] _$s7SPMDemo14ViewControllerC24$__lazy_storage_$_button33_D9ECB461E2556CB28657075004EBA95ALLSo8UIButtonCSgvpfi
0x100004AE0	0x00000070	[  3] _$s7SPMDemo14ViewControllerC05tableB0So07UITableB0CvpACTK
0x100004B50	0x000000A0	[  3] _$s7SPMDemo14ViewControllerC05tableB0So07UITableB0CvpACTk
0x100004BF0	0x00000120	[  3] _$s7SPMDemo14ViewControllerC05tableB0So07UITableB0Cvg

...
...
  • 说明

    • Address 地址
    • Size 大小
    • File 文件(.o文件,也就是源文件)
    • Name 符号
  • 二进制排列顺序

    1. 按照文件顺序: 也就是在Build phases -> Compile Sources中文件的顺序,自上至下优先级排列
    2. 文件中函数的书写顺序,自上至下
  • 二进制重排

    二进制重排的原理就是利用前端编译器插桩,获取我们优先被加载到内存的方法符号表,生成.order文件,在Build Setting -> Linking -> Order File中配置路径, 然后再通过优先排列,从而减少Page fault次数,降低缺页中断的等待时长,从而提升启动速度

    OC(Clang)与Swift(Swiftc)前端编译器的关系,所以开启位置不同

    • OC 开启Trace Build Setting - Other C Flag 中添加-fsanitize-coverage=func,trace-pc-guard

      默认Trace会捕获所有的跳转指令,包含一些循环语句,=func我们只关心函数、方法

    • Swift 开启Trace Build Setting - Other Swift Flag 中添加-sanitize-coverage=func-sanitize=undefined

  • LLVM - SanitizerCoverage - Tracing PCs with guards

⚠️ **GitHub.com Fallback** ⚠️