3.14 动态链接(1): 与位置无关代码

本文探讨了动态链接的过程,包括动态链接器的工作原理和动态库的运行地址。着重讲解了装载时重定位的问题以及如何通过地址无关代码(PIC)实现共享,同时涉及ARM相对寻址和全局偏移表在PIC技术中的作用。
摘要由CSDN通过智能技术生成

动态链接(1):与位置无关代码

1 动态链接过程

  1. Linux命令行下运行一个程序,操作系统给程序开启一个进程
  2. 动态链接器被映射到程序地址空间,OS将控制权交给动态链接器
  3. 动态链接器解析可执行文件中未确定符号、需要链接的动态库
  4. 加载对应的动态库、进行重定位等工作
  5. 动态链接器将控制权交给可执行程序,运行程序
    在这里插入图片描述

2 动态库的运行地址

加载到内存中的地址是随机的,根据地址空间空闲情况分配
动态库被装载到内存任意地址都可以运行,怎么实现?

3 装载时重定位

3.1 基本思想

  1. 可执行文件中对所有绝对地址的引用,等动态库加载到内存, 地址确定后,再对可执行文件中的绝对地址引用进行重定位操作
  2. 实现:GCC编译使用–shared参数,生成共享动态链接库

3.2 产生的问题

对于每个进程,共享库都链接到一个不同的地址,导致动态库无法在多个进程之间共享,无法节省内存,违背了动态库的设计初衷

4 与地址无关的代码

4.1 特点

放到哪里,都可以执行,无须重定位,无须改变

4.2 实现思想

  1. 将指令中需要修改的部分分离出来,跟数据放在一起
  2. 剩余指令就可以做到与地址无关,被多个进程共享
  3. 数据和需要被修改的指令在每个进程都有一个副本,互不影响

4.3 如何实现

  1. 地址无关代码技术(PIC:position-independent code)
  2. 编译:gcc -fPIC -c main.c -o libsub.so
  3. 链接:gcc xxx.c -L. -lsub

5 PIC技术底层支撑

在这里插入图片描述

5.1 模块内部

ARM相对寻址

  1. PC作为基址,指令中的地址码段作为偏移量
  2. 两者相加得到的地址即为操作数的有效地址
  3. 对应的汇编指令:B/BL、ADR/ADRL

5.2 模块外部

核心问题:如何使引用外部模块的符号地址无关
核心思想:

  1. 动态链接重定位时,填写每个符号的 GOT(全局偏移表)
  2. 引用外部模块符号时查全局偏移表,间接跳转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值