破除迷雾-重定位
问题
- 之前一直不理解重定位表中的条目是如何生成的
- 需要为哪些代码,哪些数据创建重定位条目
解答
《深入理解计算机操作系统》7.7节:
- 当汇编器生成一个模块时,在遇到对最终位置未知的目标引用时,它就会创建一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用
- offset:该条目表示的要修改的位置在该节的偏移
- symbol:需要修改引用指向的符号
- type:告知链接器如何对该位置进行修改
- 当汇编器生成一个模块时,在遇到对最终位置未知的目标引用时,它就会创建一个重定位条目,告诉链接器在将目标文件合并成可执行文件时如何修改这个引用
每个重定位条目都表示了一个必须修改的引用处
经过这部分描述,可以看出:
- 如果当前编译单元引用了外部的函数、变量,那肯定要为其生成一个重定位条目;但是对于当前编译单元中定义的函数、变量呢 ????
- 这是因为,后续所有目标文件链接为可执行文件时,需要聚合相同的节为一个段,会改变每个编译单元中代码段、数据段的原本相对位置。如果编译单元中使用相对地址寻址,后续聚合时仍会产生问题! -> 猜测也需要生成重定位表项
- 经过实验发现,在编译某个编译单元时,也会为当前编译单元中定义的全局变量、函数生成重定位表项!!!即使最终也是使用相对地址寻址的方式进行!!!
破除迷雾-重定位
http://example.com/2024/07/22/破除迷雾-重定位/