为什么在编译x86_64上的静态库时,gcc不会隐式提供-fPIC标志

编译共享对象时遇到了很多问题,这些对象与静态库静态链接。 这个问题只出现在x84_64平台上。 当在x86_32上做同样的编译工作时,我没有任何问题。

也许这是一个操作系统特定的GCCconfiguration的事情,但我的研究表明,它的GCC如何在x86_64平台上工作。 无论如何,我在Ubuntu 10.04 x86_64上使用gcc 4.4.3。

问题是如何解决的?确保所有的静态库依赖关系都是用-fPIC编译的。

问题1: -fpic和-fPIC(显然-fPIC在x86上生成更多指令)有什么区别? 为什么后面的types在x86_64上下文中更相关?

问题2:我的假设是,当链接到静态代码时,您在链接时将函数硬连接到二进制文件,为什么它需要“位置独立代码”机制提供的间接级别?

问题3:现在,如果x86不需要-fpic / -fPIC来将共享对象与静态归档链接起来,为什么在x86_64中需要它?

问题4:即使需要,为什么不提供隐含的? 我认为改变应该是一个很大的禁忌

  1. 见问题3544035 。 也在这里和那里讨论。
  2. 这取决于你的静态库有什么用处。 如果你只想把它链接到程序中,它不需要PIC代码(libtool调用一个便利库,因为你几乎可以没有它,它只是帮助你的编译过程达到合理的大小)。 否则,如果您打算将共享库与它链接,则需要在静态库中使用PIC代码。
  3. 见问题3146744 ,也在这里
  4. 它膨胀了你的代码,所以它不是默认的。 有一件事情要看,当你编译单个目标文件时,GCC不知道你是否要创build一个共享库。 在我的大多数小型项目中,我只是将一些目标文件链接在一起,例如不需要PIC代码。

另外,我的build议是:如果你需要担心,你做错了(或者你喜欢学习困难的方式,这是很好的,因为你会得到更多的经验)。 编译系统(libtool,cmake,无论你使用什么)都应该为你做。