我在PIC上阅读this帖子,看起来使用PIC总是好的(无论何时是exe / static / share llibrary)。
那有什么缺点呢? 是否有例子说明何时不使用PIC?
答案 0 :(得分:6)
链接问题中接受的答案非常简单,只会在PIC和非PIC代码之间产生一个不同的东西,产生相对而不是绝对的跳跃。
当您制作PIC代码时,不仅代码位置独立,它也是数据。并非所有代码或数据都可以通过使用相对偏移来解决,它必须在加载时(当库/程序加载到内存中时)或甚至在运行时解析。
此外,使用相对寻址意味着CPU必须将相对偏移转换为绝对地址,而不是由编译器完成。
在具有虚拟内存的系统上,当编译器可以一劳永逸地执行此操作时,通常无需在这些相对地址解析上花费负载或运行时间。
答案 1 :(得分:3)
在某些体系结构(包括x86)上,-fPIC
生成更多更糟糕的代码(即函数调用),用于加载/存储数据。虽然这对于库是可以容忍的,但对于可执行文件来说是不可取的。
amd64指令集(以及最近的gnu-x32 ABI)的主要卖点之一是增加了" PC相对加载/存储"说明,解决效率问题。
请注意,强化系统通常执行为所有可执行文件启用-fPIE
,因为它允许地址空间布局随机性。