计算机系统篇之链接(5):静态链接(下)——重定位

本文详细探讨了链接过程中的重定位,包括整体步骤、重定位条目、重定位类型及其应用实例,旨在解释如何确定符号定义的运行时内存地址并修正引用。通过分析ELF中的重定位条目,解释了R_X86_64系列重定位类型如何计算符号引用的值。
摘要由CSDN通过智能技术生成

计算机系统篇之链接(5):重定位

Author:stormQ

Wednesday, 15. April 2020 04:35PM


重定位的整体过程

重定位的目的是确定每个符号定义的运行时内存地址,并修改对这些符号的引用,使之指向符号定义的运行时内存地址。

重定位的整体过程可以分为两个步骤:

  • 重定位节和符号定义。链接器将输入目标文件的相同节合并成一个节,合并的节将作为可执行目标文件中此类型的节。随后,链接器确定每个合并节的运行时内存地址,并确定合并节中符号定义的运行时内存地址。这一步骤完成后,可执行目标文件中的所有指令和符号定义的运行时内存地址就唯一确定了。

  • 重定位节中的符号引用。链接器修改所有的符号引用,使之指向符号定义的运行时内存地址。链接器要执行此步骤依赖于目标文件中的重定位信息。

重定位条目

ELF 中的重定位条目分为两种格式:RelRela。每个重定位条目表示一个必须被重定位的符号引用,并指明如何计算被修改的符号引用。重定位条目由汇编器生成。

查看可重定位目标文件中的重定位信息:

$ readelf -r main.o

Relocation section '.rela.text' at offset 0x208 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000005  000b00000002 R_X86_64_PC32     0000000000000000 _Z4funcv - 4

Relocation section '.rela.eh_frame' at offset 0x220 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0
  • 注:

    • Offset是 Relocation Entry 结构体中的第 1 个字段,占用 8 字节,表示需要修改的符号引用的位置。对于可重定位目标文件,该字段表示需要修改的符号引用的起始位置在目标 section (.rela.text中的重定位条目对应的目标 section 为.text.rela.data中的重定位条目对应的目标 section 为.data,以此类推)中的偏移量(字节)。对于可执行目标文件和可共享目标文件,该字段表示需要修改的符号引用的起始位置所对应的虚拟内存地址。

    • Info是 Relocation Entry 结构体中的第 2 个字段,占用 8 字节,表示符号表索引和重定位类型(符号表索引占用高 32 位,重定位类型占用低 32 位)。

      符号表索引表示需要修改的符号引用在.symtabsection中的索引。这里的Sym. ValueSym. Name列只是打印了所对应符号表条目中ValueName列的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值