为什么在x86_64上编译静态库时,海湾合作os不隐含地提供-FPIC标志
-
09-10-2019 - |
题
我遇到了许多问题,这些问题编译了共享对象,这些对象可以静态地与静态库联系起来。此问题仅显示在X84_64平台上。在X86_32上进行相同的汇编工作时,我没有任何问题。
也许这是特定于OS的GCC配置,但我的研究表明,这是GCC在X86_64平台上的工作方式。无论如何,我在Ubuntu 10.04 x86_64上使用GCC 4.4.3。
问题如何解决?
问题1: -FPIC和-FPIC之间有什么区别(显然-FPIC在x86上生成更多指令)?为什么以后的类型在x86_64上下文中更相关?
问题2: 我的假设是,当您针对静态代码链接时,您会在链接时间将功能努力地将功能划分到您的二进制中,为什么需要间接级别的“位置独立代码”机械提供?
问题3: 现在,如果x86不需要-fpic / -fpic来链接与静态档案的共享对象,为什么在x86_64中需要它?
问题4: 即使需要它为什么不隐含地提供?我以为破裂的变化应该是一个很大的禁忌
解决方案
- 请参阅问题 3544035. 。也讨论了 这里 和 那里.
- 这取决于您对静态库的使用。如果您只想将其链接到程序中,它不需要PIC代码(libtool呼叫便利库,因为没有它,您几乎可以做到这一点,例如,它只是有助于使您的编译过程达到合理的尺寸)。否则,如果您打算将共享库链接到它,则需要静态库中的PIC代码。
- 请参阅问题 3146744 并且 这里
- 它会膨胀您的代码,因此不是默认值。要看到的一件事是,当您编译单个对象文件时,GCC不知道您是否要从中创建共享库。在我的大多数较小项目中,我只需将几个对象文件链接在一起,而不需要PIC代码。
另外,我的建议是:如果您需要担心这一点,您就做错了(或者您想学习艰难的方法,这很好,因为您会从经验中获得更多)。汇编系统(Libtool,Cmake,无论您使用什么)应该为您做到这一点。
不隶属于 StackOverflow