为什么 OSX 10.5 上的 GCC 默认开启 -fPIC 选项?毕竟,它不会生成更大更慢的代码吗?
问问题
710 次
1 回答
4
除非您的程序有很多非常小的函数,所有这些函数都使用全局变量或静态变量,或者 Objective-c,否则任何性能下降或大小差异都不会引起注意。PIC 不用于自动局部变量,因为它们已经使用堆栈访问。在需要它的函数中,设置只需要四条指令,与函数中的代码相比并不算多。使用 PIC 的每次访问只比没有它的访问长一个字节,因此也没有太大区别。
如果您正在构建 64 位,PIC 可能会更小,并且可能不会有性能差异。x86-64 架构添加了新的指令相关寻址,这意味着 PIC 不需要设置。这种新的寻址模式实际上比在指令中编码绝对地址短一个字节,因为没有使用 SIB 字节。
最后,使用 PIC 使您的代码更加安全。如果您的代码每次都必须在同一个地方加载,那么有人可能会找到重要函数和数据的位置并在运行时引起问题。但是,如果操作系统可以选择将您的代码加载到不同的地址,那么任何试图引起问题的人都必须在每次运行程序时找出函数和数据结构的位置。
于 2011-09-07T02:49:37.903 回答