学习链接的时候的对重定位的疑问

讨论 未结 4 40
zamaojava
zamaojava 会员 2022年7月3日 07:56 发表
<p>ELF 格式下,在重定位的时候,重定位类型有 </p> <ol> <li>R_X86_64_PC32 相对寻址</li> <li>R_X86_64_32 绝对寻址 我感觉用一个绝对寻址类型就可以了,为什么要多此一举的用 相对寻址。</li> </ol> <p>百度百科对相对寻址解释的好处: 使用相对寻址可节省指令中的地址位数,也便于程序在内存中成块搬动。</p> <p>这就是用相对寻址的原因嘛?还是我理解有问题</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
4个回复
  • ahhui
    2022年7月3日 07:56
    ELF 格式不太清楚,我好像记得 PE 格式的节载入到内存里,不一定是连续地址,所以绝对寻址可能需要转译,相对寻址会更快一些。不过也可能我记得不准确。
    0 0
  • sujin190
    2022年7月3日 08:25
    你一个程序不止载入一个库吧,每个库都是单独编译的,那么也就是程序编译的时候其实无法确定实际地址,需要在程序载入的时候完成地址重重定向,只有绝对地址的话也就意味着你要把所有指令重写一遍,而且不同程序载入的相同库不能共享,有相对地址就简单多了,不同代码和库编译成不同段,地址编译成段内相对地址,载入只需重定向段基址即可,而且更厉害的是这个相对地址加段基址的选址过程完全由 CPU 的内存管理器自动完成,不会造成运行时性能损失,此外不同程序载入库的问题也可以放到统一的物理内存之中之后再通过段基址映射重定向到每个程序需要的地址去,大幅节省内存,我记得应该是这样的
    0 0
  • agagega
    2022年7月3日 08:56
    相对寻址可能和指令集本身的寻址方式有关?如果指令集本身也支持这种相对寻址模式,那有时候跳转指令就会很方便
    0 0
  • LotusChuan
    2022年7月3日 08:56
    我觉得就基本和#2 的差不多,如果你的库都是 static 的,只用绝对地址没什么大问题,但是如果你用的是 shared 库,它们本身就是加载在内存中的,内存地址会变动,如果你使用绝对地址会导致你必须要保证你的 shared 库在内存中的地址不变,这会显著影响内存利用率。用相对地址就可以解决这个问题,因为你每次载入程序的时候你实际上只需要修改 data 段中的 shared 库地址,只改一处,有硬件支持甚至不用改,和页表一样;但如果你用绝对地址,你得改 code 段中所有的有关地址,性能损失很严重。
    0 0