阅读 747

iOS二进制重排

一、概念

项目中将启动时需要调用的函数放到一起 ( 比如 前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

image.png

修改完毕后 clean 一下 , 运行工程 , Products - show in finder, 如下图

image.png

如下图找到.txt文件

image.png

打开上图中的.txt文件如下

image.png

可以看到 , 这个符号顺序明显是按照 Compile Sources 的文件顺序来排列的

image.png

四、具体如何实现二进制的重排

4.1

来到工程根目录 , 新建一个文件 my_oder.order , 随便挑选几个启动时就需要加载的方法 (我以ViewController中的方法举例子),

my_oder.order 文件如下图

image.png

ViewController中的方法如下图

image.png

4.2 配置oder file文件路径 ,如下图

image.png

4.3重新运行 , 查看 工程的符号顺序

image.png

可以看到 , 我们所写的这三个方法已经被放到最前面了 , 至此 ,

生成的 macho 中距离首地址偏移量最小的代码就是我们所写的这三个方法 ,

假设这三个方法原本在不同的三页 , 那么我们就已经优化掉了两个 page fault.

以上就是二进制重排的实现

文章分类
iOS