sqlserver如何定义一个静态变量_iOS汇编教程(八)静态链接中的 Relocation 静态库链接时是如何保证对变量的相对寻址依然正确的?...

本文介绍了iOS应用开发中,静态库链接时如何通过Relocation Fixup确保相对寻址的正确性。通过一个例子展示了链接过程中的段重排和Fixup操作,详细解释了Relocation段在静态链接中的作用,以及如何基于Relocation Info进行Fixup。
摘要由CSDN通过智能技术生成

系列文章

  1. iOS汇编入门教程(一)ARM64汇编基础

  2. iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码

  3. iOS汇编入门教程(三)汇编中的 Section 与数据存取

  4. iOS汇编教程(四)基于 LLDB 动态调试快速分析系统函数的实现

  5. iOS汇编教程(五)Objc Block 的内存布局和汇编表示

  6. iOS汇编教程(六)CPU 指令重排与内存屏障

  7. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值