Link Map File - ShenYj/ShenYj.github.io GitHub Wiki
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 符号
-
二进制排列顺序
- 按照文件顺序: 也就是在
Build phases -> Compile Sources
中文件的顺序,自上至下优先级排列 - 文件中函数的书写顺序,自上至下
- 按照文件顺序: 也就是在
-
二进制重排
二进制重排的原理就是利用前端编译器插桩,获取我们优先被加载到内存的方法符号表,生成.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
-