You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

共享库.so加载到任意内存地址时,各段/节之间的相对距离是否固定不变?

结论

共享库(.so)的各个段之间的相对偏移在加载前后是完全固定的,和链接阶段生成的程序头中指定的偏移完全一致。

  • 动态链接器加载共享库时,会将共享库的所有段作为一个整体,映射到进程虚拟地址空间的某块连续区域,仅会给整个共享库添加一个统一的加载基地址偏移,不会单独调整各个段的相对位置。所有段运行时的实际地址 = 加载基地址 + 链接时预设的段虚拟地址,因此任意两个段之间的差值永远固定。
  • 你观察到的RIP相对寻址指令中的硬编码偏移,正是基于这个特性实现的:RIP寄存器存储的是当前指令下一条指令的地址,等于「加载基地址 + 该指令下一条指令的链接时预设地址」,你要访问的GOT表项的实际地址等于「加载基地址 + 该GOT表项的链接时预设地址」,二者相减得到的偏移值和加载基地址无关,因此可以在链接阶段直接算出硬编码到指令中,运行时不需要修改。
  • 你计算的.text节和.got节的总偏移差和指令中的偏移不符,是因为你用的是节的起始地址做计算,而指令中的偏移是基于当前指令的RIP值计算的:你例子里访问GOT的指令地址是0x1101,这条指令长度为7字节,因此RIP值为0x1101 + 7 = 0x1108,要访问的GOT表项地址是0x3fd8,二者差值0x3fd8 - 0x1108 = 0x2ed0,刚好和指令中的硬编码偏移一致,也验证了相对偏移固定的逻辑。

内容的提问来源于stack exchange,提问作者knatten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:54:04