破除迷雾-重定位

问题

  • 之前一直不理解重定位表中的条目是如何生成的
  • 需要为哪些代码,哪些数据创建重定位条目

解答

  • 《深入理解计算机操作系统》7.7节:

    • 当汇编器生成一个模块时,在遇到对最终位置未知的目标引用时,它就会创建一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用
      • offset:该条目表示的要修改的位置在该节的偏移
      • symbol:需要修改引用指向的符号
      • type:告知链接器如何对该位置进行修改
  • 每个重定位条目都表示了一个必须修改的引用处

  • 经过这部分描述,可以看出:

    • 如果当前编译单元引用了外部的函数、变量,那肯定要为其生成一个重定位条目;但是对于当前编译单元中定义的函数、变量呢 ????
    • 这是因为,后续所有目标文件链接为可执行文件时,需要聚合相同的节为一个段,会改变每个编译单元中代码段、数据段的原本相对位置。如果编译单元中使用相对地址寻址,后续聚合时仍会产生问题! -> 猜测也需要生成重定位表项
    • 经过实验发现,在编译某个编译单元时,也会为当前编译单元中定义的全局变量、函数生成重定位表项!!!即使最终也是使用相对地址寻址的方式进行!!!

破除迷雾-重定位
http://example.com/2024/07/22/破除迷雾-重定位/
作者
Cyokeo
发布于
2024年7月22日
许可协议