PICX的GCC上的PIC

时间:2011-08-16 12:34:18

标签: macos gcc fpic

为什么OSX 10.5上的GCC默认打开-fPIC选项?毕竟,它不会产生更大更慢的代码吗?

1 个答案:

答案 0 :(得分:4)

除非你的程序有很多非常小的函数,所有函数都使用全局变量或静态变量,或者使用objective-c,否则任何性能下降或大小差异都是不明显的。 PIC不用于自动局部变量,因为它们已经使用堆栈访问。在需要它的函数中,设置只需要四条指令,与函数中的代码相比并不多。使用PIC的每次访问只比没有它的访问长一个字节,所以再没有太大区别。

如果您正在构建64位,PIC可能会更小,并且可能没有性能差异。 x86-64架构增加了一个新的指令相关寻址,这意味着PIC不需要设置。这种新的寻址模式实际上比编码指令中的绝对地址短一个字节,因为不使用SIB字节。

最后,使用PIC可以使您的代码更安全。如果每次都必须在同一个地方加载代码,那么有人可能会找到重要函数和数据的位置,并在运行时导致问题。但是,如果操作系统可以选择在不同的地址加载代码,那么任何试图导致问题的人都必须找出每次运行程序时函数和数据结构的位置。