在上篇文章我们说了「符号解析」,符号解析的任务就是:建立定义与引用之间的关联,而「重定址」的任务就是:把程序码中每一个符号引用和正好一个符号定义关联起来。
当程序编译完成後,组译产生二进制的可重定址文件,产生的文件包含两个 Section (上一节有说明)
这两个 Scetion 中 包含了程序码的重定址项(Relocation entries),其资料结构如下
typedef struct
{
Elf64_Addr r_offset; /* Address of reference */
Elf64_Xword r_info; /* Symbol index and type of relocation */
} Elf64_Rel;
typedef struct
{
Elf64_Addr r_offset; /* Address of reference */
Elf64_Xword r_info; /* Symbol index and type of relocation */
Elf64_Sxword r_addend; /* Constant part of expression */
} Elf64_Rela
在重定址阶段,载入器(loader)遍历所有重定址项并写入每个 r_offset 指定的位置,视r_info情况选择 Elf64_Rel 和 Elf64_Rela,Elf64_Rel 的符号位址由 r_info 获得,Elf64_Rela 需从r_info选择计算公式加 r_addend 获得。
※比如说,${F}$ 中有一个未解析符号 ${K}$,如果 ${D}$ 中存在对它的定义,那麽就可以建立联系。如果没有就放入 ${U}$ 中。
如果是Library Files,会试图把所有 ${U}$ 中的符号与 Library Files 中的符号匹配,匹配上了就从 ${U}$ 放入 ${D}$ 中。并把匹配上的 Module 放入 ${E}$ 中。一直重复直到 ${U}$、${D}$ 不再变化。Library Files剩下的内容直接就不管了。
如果往 ${D}$ 中放入了一个已经存在的符号或者扫描完所有文件後 ${U}$ 还是非空,则连结器会停止并报错。否则将 ${E}$ 中内容经过重定址後合并,生成可执行文件。
深入理解计算机系统
AArch64 relocation prefixes?
这是关於在 hahow-开启资料科学的学习大门 - R入门教学-课程的心得。 Day1 关於R R由...
隐私如浮云,多半用户即刻享受当下服务的快感解决需求,至於隐私就都化为浮云飘过视而无见,如同Day 2...
输入型态 首先介绍标签里面的属性 name: 栏位名称 用来指定送出去的该笔资料要用什麽名称给服务器...
「你因为两个原因来读这本书:首先,你是位程序设计师。再者,你想成为一位更好的程序设计师」 取自: ...
各位朋友好! 这是第一次参加iThome铁人赛~ 本次参加主要目标为完成挑战後,有能力制作个人网站,...