位置无关代码

本文探讨了Linux系统中,由于共享对象的地址冲突和更新问题导致的装载时重定位需求。地址无关码(PIC)是解决这一问题的关键,允许代码在不需重定位的情况下加载。GCC的-fPIC选项可以生成使用PIC的共享对象。在实现地址无关码的过程中,通过全局偏移表(GOT)来处理模块间的全局变量访问和调用。在ELF共享库中,全局变量默认被视为其他模块定义,通过GOT进行访问。
摘要由CSDN通过智能技术生成

对于一个包含共享对象和可执行目标文件的模块来说,共享对象在装载前往往不能确定自己在进程虚拟空间的位置,具体原因有以下两点

  1. 地址冲突问题

    由于共享对象会被很多其他模块共同使用,如果共享对象使用一个固定的装载地址,那么这个地址就不能被其他进程所使用,会造成空间的浪费

  2. 共享库的更新问题

    共享库如果使用规固定地址,那么对共享库升级后共享库中的全局函数和变量地址就不能够改变,否则如果有应用程序在链接时就已经绑定到了这些地址,那么升级后他们必须重新进行链接

因此,共享对象的装载时地址往往会在装载前一刻由操作系统决定,只有当装载后才能确定

装载时重定位

由于共享对象的装载时地址无法事先确定,所以在产生共享对象时,就出现了装载时重定位,即在装载时进行重定位

在Linux中,只使用-shared选项时会默认产生使用装载时重定位的共享对象

3.地址无关码
  • 由于装载时重定位的方法需要对指令部分进行修改,所以没有办法做到一份指令同时被多个进程所共享

  • 对于共享对象中的可修改数据部分来说使用转载时重定位则没有问题,因为这部分会被每个进程都拷贝一份副本

由于装载时重定位的指令部分无法共享的确定,由此产生了地址无关码

  • 可以加载而无需重定位的代码称为地址无关码
  • gcc中使用-fPIC选项可以得到使用地址无关码的共享对象

实现方法

  • 基本思想

    将指令中哪些需要被修改的部分

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值