我遇到了许多问题,这些问题编译了共享对象,这些对象可以静态地与静态库联系起来。此问题仅显示在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: 即使需要它为什么不隐含地提供?我以为破裂的变化应该是一个很大的禁忌

有帮助吗?

解决方案

  1. 请参阅问题 3544035. 。也讨论了 这里那里.
  2. 这取决于您对静态库的使用。如果您只想将其链接到程序中,它不需要PIC代码(libtool呼叫便利库,因为没有它,您几乎可以做到这一点,例如,它只是有助于使您的编译过程达到合理的尺寸)。否则,如果您打算将共享库链接到它,则需要静态库中的PIC代码。
  3. 请参阅问题 3146744 并且 这里
  4. 它会膨胀您的代码,因此不是默认值。要看到的一件事是,当您编译单个对象文件时,GCC不知道您是否要从中创建共享库。在我的大多数较小项目中,我只需将几个对象文件链接在一起,而不需要PIC代码。

另外,我的建议是:如果您需要担心这一点,您就做错了(或者您想学习艰难的方法,这很好,因为您会从经验中获得更多)。汇编系统(Libtool,Cmake,无论您使用什么)应该为您做到这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top