重定位过程

重定位是链接器在符号解析完成后执行的第二个核心任务,负责将逻辑地址转换为运行时实际内存地址。

第一步:分配运行时地址。链接器根据汇总后的各节信息(.text.data 等),决定每个节和每个符号在最终可执行文件中的虚拟内存地址。例如,确定 main 函数最终会被加载到 0x401000 处。

第二步:修改代码中的地址(填空)。编译器在生成 .o 文件时,遇到外部函数调用或全局变量引用会先留一个占位符(如 call 0x00000000)。重定位阶段将这些占位符替换为第一步计算出的真实地址。

重定位所需的全部修复信息存储在 rel.text.rel.data 节中。这些节包含可重定位条目(Relocation Entries),每个条目记录了需要修改的位置、目标符号、重定位类型和调整值。

链接到