重定位, pic & 延迟绑定
重定位 (Relocation)
让我们抛出两个问题:什么是重定位?为什么要重定位呢?
在一个 C 源码被经过编译和汇编,生成一个由机器码组成的 ELF
文件(这是一个可重定位文件 ET_REL
)之后,要想成功执行它的话,我们要考虑到这样一个问题:
- 这个 C 源码可能使用了库函数,比如
printf
,malloc
等等,这些库函数是定义在标准库中的,仅仅依靠这一个 C 源码的话是无法运行的。
那么编译器如何处理这个问题呢?有两个方案:
- 使用静态链接,将标准库中的代码与 C 源码直接整合到一起,形成一个更大的
ELF
文件,自己本身就包含了所有所需的代码,可以独立完成任务。 - 使用动态链接,首先使用
现在我们要说清楚,重定位有三个东西要说: 运行时重定位,
PIC
pic 是位置无关代码,就是不管加载的时候把代码放在哪个地址,都能够正常执行(其它的都没什么好说的,主要是能够正常访问库函数和全局变量的地址)
这里有两个东西要说:
一个是传统的
PIC
(32位),还有一个是RIP-relative PIC
(64位)。- 传统
PIC
,这个的原理是这样的:首先,在编译的时候,编译器把 C 源码中访问全局变量的
- 传统
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 HaoIne!