为什么不总是使用fpic(位置无关代码)?

Azi*_*zil 17 c++ gcc fpic

我在PIC上阅读了这篇文章,看起来使用PIC总是好的(无论何时是exe/static/share llibrary).

那有什么缺点呢?
是否有例子说明何时不使用PIC?

Som*_*ude 6

链接问题中接受的答案非常简单,只会在PIC和非PIC代码之间产生一个不同的事情,即产生相对而非绝对的跳转.

制作PIC代码时,不仅是位置独立的代码,它也是数据.并非所有代码或数据都可以通过使用相对偏移来解决,它必须在加载时(当库/程序加载到内存中时)或甚至在运行时解析.

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

在具有虚拟内存的系统上,当编译器可以一劳永逸地执行此操作时,通常无需在这些相对地址解析上花费加载或运行时间.


o11*_*11c 5

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

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

请注意,强化系统通常启用-fPIE所有可执行文件,因为它允许地址空间布局随机性。

  • 啊……我们的意思是一样的。“函数调用”是一种将偏移表的地址放入寄存器的技巧。保持缓存占用一个寄存器(正如我所说),而不是缓存它使数据访问需要一个函数调用(如你所说)。需要注意的是,这是 x86 架构典型的“丑陋位”之一;大多数(如果不是所有)其他 CPU 系列都允许在 1980 年代进行适当的 PC 相对寻址...... (2认同)