Linux C符号的重定位信息?

如题所述

当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
温馨提示:答案为网友推荐,仅供参考
相似回答