为什么不总是使用 fpic (Position Independent Code)?

Why not always use fpic (Position Independent Code)?

我在 PIC 上阅读了 this post,似乎使用 PIC 总是好的(无论是 exe / static / share llibrary)。

那么缺点是什么?
是否有详细说明何时不使用 PIC 的示例?

链接问题中接受的答案非常简单,只提出了 PIC 和非 PIC 代码之间的区别,生成的跳转是相对的而不是绝对的。

当您制作 PIC 代码时,不仅 代码 与位置无关,数据也是如此。并不是所有的代码或数据都可以简单地通过使用相对偏移量来解决,它必须在加载时(当 library/program 加载到内存中时)甚至在 运行 期间解决。

此外,使用相对寻址意味着 CPU 必须将相对偏移量转换为绝对地址,而不是由编译器完成。

在具有虚拟内存的系统上,当编译器可以一劳永逸地完成时,通常不需要在这些相对地址解析上花费加载时间或 运行 时间。

在某些架构上,包括 x86,-fPIC 为 loads/stores 数据生成 更糟糕的代码(即函数调用)。虽然这对于库来说是可以容忍的,但对于可执行文件来说是不可取的。

amd64 指令集(以及最近的 gnu-x32 ABI)的主要卖点之一是添加了 "PC-relative load/store" 指令,解决了效率问题。

注意加固系统通常为所有可执行文件启用-fPIE,因为它允许地址-space布局随机性。