重定位偏移量&逻辑地址的相互转化

版权声明:本文为博主原创文章,未经博主允许不得转载。个人博客:www.saoguang.top https://blog.csdn.net/u011580175/article/details/82292405

重定位类型

  1. Relocation Types重定位类型,指示了链接器如何修复链接地址。
  2. 重定位类型对应的计算方式可以在elf文档中查询到。elf文档

常见的重定位类型偏移量的计算

  • R_386_PC32类型,偏移量计算方式S+A-P
    • A This means the addend(加数) used to compute the value of the relocatable field.(加数,如果重定位目标是Elfxx_Rela,则包含r_addend字段,即显式加数。Elfxx_Rel则是隐式加数。)
    • P This means the place (section offset or address) of the storage unit being relocated(computed using r_offset).(即需要进行重定位的目标的地址[注意,时条目的地址,并不是调用指令的地址]或者段偏移)
    • S This means the value of the symbol whose index resides in the relocation entry(索引位于重定位条目的符号的值)(也就是,索引的目标的实际地址)

隐式加数和显示加数

  1. 区分:重定位目标如果带有r_addend字段,则为显示加数,否则即隐式。
  2. 隐式加数:隐式加数一般在文件编译汇编,但是不链接。也就是产生.obj文件时,填充到调用语句中。
  3. 显示加数:显示加数在产生的.obj文件中的调用语句值为0。直接存储在重定位目标结构体r_addend字段中。

偏移量计算逻辑地址

address_of_call + offset + length_of_call(调用指令的长度)

猜你喜欢

转载自blog.csdn.net/u011580175/article/details/82292405