Day.6 深入理解连结之重定址

在上篇文章我们说了「符号解析」,符号解析的任务就是:建立定义与引用之间的关联,而「重定址」的任务就是:把程序码中每一个符号引用和正好一个符号定义关联起来。

重定址的流程

  • 合并相同的 section (.data和.text)
  • 对「定义的符号」进行重定址
    • 确定「定义的符号」在虚拟空间的绝对位址,完成这一步以後,每个全域或区域变数都可以确定位置。
  • 对「引用符号」进行重定址
    • 用上述「定义符号」的绝对位置修改.text 和 .data 中「引用符号」的地址。要执行这一步,连结器依赖於可重定址目标模块中的重定址项(Relocation entries)的资料结构。

连结器是如何完成重定址的?

当程序编译完成後,组译产生二进制的可重定址文件,产生的文件包含两个 Section (上一节有说明)

  • rel.text (函式位置)
  • rel.data (变数位置)

这两个 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
  • r_offset 指出当前需要重定址的位址相对所在的Section起始位置的偏移量。
  • r_info 指出当前的符号在符号表中的索引以及重定址的类型
  • r_addend 一些类型的重定址要使用它对被修改引用的值做偏移调整

在重定址阶段,载入器(loader)遍历所有重定址项并写入每个 r_offset 指定的位置,视r_info情况选择 Elf64_RelElf64_RelaElf64_Rel 的符号位址由 r_info 获得,Elf64_Rela 需从r_info选择计算公式加 r_addend 获得。

静态连结过程

  • 对每一个输入文件来说,首先判断是不是Library Files
  • 如果不是Library Files,就是Obj file---${F}$,就能把Obj file放入 ${E}$ 中,根据 ${F}$ 中未解析符号和定义符号判断後分别放入 ${U}$、${D}$中

※比如说,${F}$ 中有一个未解析符号 ${K}$,如果 ${D}$ 中存在对它的定义,那麽就可以建立联系。如果没有就放入 ${U}$ 中。

  • 如果是Library Files,会试图把所有 ${U}$ 中的符号与 Library Files 中的符号匹配,匹配上了就从 ${U}$ 放入 ${D}$ 中。并把匹配上的 Module 放入 ${E}$ 中。一直重复直到 ${U}$、${D}$ 不再变化。Library Files剩下的内容直接就不管了。

  • 如果往 ${D}$ 中放入了一个已经存在的符号或者扫描完所有文件後 ${U}$ 还是非空,则连结器会停止并报错。否则将 ${E}$ 中内容经过重定址後合并,生成可执行文件。

参考资料

深入理解计算机系统
AArch64 relocation prefixes?


<<:  [Day04] Wordpress

>>:  两种开发模式 (MVC, MVVM) 比较

R语言-1-关於R

这是关於在 hahow-开启资料科学的学习大门 - R入门教学-课程的心得。 Day1 关於R R由...

Day 11 已故用户的隐私设计

隐私如浮云,多半用户即刻享受当下服务的快感解决需求,至於隐私就都化为浮云飘过视而无见,如同Day 2...

Day10输入input(HTML)

输入型态 首先介绍标签里面的属性 name: 栏位名称 用来指定送出去的该笔资料要用什麽名称给服务器...

Day 01: 【序】– 架构与设计、代码、工程师

「你因为两个原因来读这本书:首先,你是位程序设计师。再者,你想成为一位更好的程序设计师」 取自: ...

[Day1] 前言

各位朋友好! 这是第一次参加iThome铁人赛~ 本次参加主要目标为完成挑战後,有能力制作个人网站,...