系列文章
iOS汇编入门教程(一)ARM64汇编基础
iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码
iOS汇编入门教程(三)汇编中的 Section 与数据存取
iOS汇编教程(四)基于 LLDB 动态调试快速分析系统函数的实现
iOS汇编教程(五)Objc Block 的内存布局和汇编表示
iOS汇编教程(六)CPU 指令重排与内存屏障
iOS汇编教程(七)ARM Exclusive - 互斥锁与读写一致性的底层实现原理
简介
在 iOS 应用开发过程中,我们常常通过静态库方式引用一些闭源三方 SDK,在编译链接时静态库的代码段、数据段和符号表等会被拼接到 App 的主二进制中,在拼接过程中静态库内代码段与数据段的相对位置会发生改变,导致原来代码中的相对寻址不能正确指向链接后产物中的数据,这就需要在链接时根据静态库插入主二进制的情况对代码段进行修正,这一过程被称为 Relocation Fixup,它是保证静态链接后逻辑正确性的关键。
本文将介绍静态库的 Relocation 段,以及静态链接时基于 Relocation Info 对 __TEXT,__text
段进行 Fixup 的过程和原理。
一个例子
下面我们来看一个简单例子,我们先新建一个 iOS 工程命名为 SimpleApp,再新建一个 Static Library 的 Target 命名为 SimpleLib,静态库里只包含一个静态全局变量和一个读取全局变量的函数:
// SimpleLib.m
static int simple_val = 100;
int getSimpleVal() {
return simple_val;
}
App 的主二进制链接了 SimpleLib,并通过 getSimpleVal 函数读取 SimpleLib 中的静态全局变量:
// ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
extern int getSimpleVal(void);
printf("the value of simple val is %d\n", getSimpleVal());
}
如果仅仅在 SimpleLib 内部考虑,不考虑编译成静态库供外部使用,simple_val 变量的存取可以通过下面的方式实现:
.section __TEXT,__text,regular,pure_instructions
.globl _getSimpleVal