一、概念
项目中将启动时需要调用的函数放到一起 ( 比如 前10页
中 ) 以尽可能减少 page fault
, 达到优化目的 . 而这个做法就叫做 二进制重排
**
**
二、原理
- 首先 ,
Xcode
是用的链接器叫做ld
,ld
有一个参数叫Order File
, 我们可以通过这个参数配置一个order
文件的路径 . - 在这个
order
文件中 , 将你需要的符号按顺序写在里面 . - 当工程
build
的时候 ,Xcode
会读取这个文件 , 打的二进制包就会按照这个文件中的符号顺序进行生成对应的mach-O
\
三、如何查看自己工程的符号顺序
重排前后我们需要查看自己的符号顺序有没有修改成功 , 这时候就用到了 Link Map
\
Link Map
是编译期间产生的产物 , ( ld 的读取二进制文件顺序默认是按照 Compile Sources
– GUI
里的顺序 ) , 它记录了二进制文件的布局 .
通过设置 Write Link Map File
来设置输出与否 , 默认是 no
.
如下图将 Write Link Map File设置为YES
修改完毕后 clean
一下 , 运行工程 , Products
– show in finder
, 如下图
如下图找到.txt文件
打开上图中的.txt文件如下
可以看到 , 这个符号顺序明显是按照 Compile Sources
的文件顺序来排列的
四、具体如何实现二进制的重排
4.1
来到工程根目录 , 新建一个文件 my_oder.order , 随便挑选几个启动时就需要加载的方法 (我以ViewController中的方法举例子),
my_oder.order 文件如下图
ViewController中的方法如下图
4.2 配置oder file文件路径 ,如下图
4.3重新运行 , 查看 工程的符号顺序
可以看到 , 我们所写的这三个方法已经被放到最前面了 , 至此 ,
生成的 macho
中距离首地址偏移量最小的代码就是我们所写的这三个方法 ,
假设这三个方法原本在不同的三页 , 那么我们就已经优化掉了两个 page fault.
以上就是二进制重排的实现