这里给出一个 ELF 文件类型的表格:
pEfltw4.png

重定位 (Relocation)

让我们抛出两个问题:什么是重定位?为什么要重定位呢?

在一个 C 源码被经过编译和汇编,生成一个由机器码组成的 ELF 文件(这是一个可重定位文件 ET_REL)之后,要想成功执行它的话,我们要考虑到这样一个问题:

  • 这个 C 源码可能使用了库函数,比如 printfmalloc 等等,这些库函数是定义在标准库中的,仅仅依靠这一个 C 源码的话是无法运行的。

那么编译器如何处理这个问题呢?有两个方案:

  1. 使用静态链接,将标准库中的代码与 C 源码直接整合到一起,形成一个更大的 ELF 文件,自己本身就包含了所有所需的代码,可以独立完成任务。
  2. 使用动态链接,首先使用

现在我们要说清楚,重定位有三个东西要说: 运行时重定位,

PIC

pic 是位置无关代码,就是不管加载的时候把代码放在哪个地址,都能够正常执行(其它的都没什么好说的,主要是能够正常访问库函数和全局变量的地址)

这里有两个东西要说:

  • 一个是传统的 PIC(32位),还有一个是 RIP-relative PIC(64位)。

    • 传统 PIC,这个的原理是这样的:首先,在编译的时候,编译器把 C 源码中访问全局变量的