123

我知道 ' -fPIC' 选项与解析地址和各个模块之间的独立性有关,但我不确定它的真正含义。你可以解释吗?

4

3 回答 3

70

PIC 代表位置无关代码。

引用man gcc

如果目标机器支持,则发出与位置无关的代码,适用于动态链接并避免对全局偏移表大小的任何限制。此选项在 AArch64、m68k、PowerPC 和 SPARC 上有所不同。

在上述架构上构建共享对象 (*.so) 时使用它。

于 2009-06-08T20:58:32.263 回答
36

f是“控制代码生成中使用的接口约定”的选项的 gcc 前缀

PIC代表“位置无关代码”,它是 m68K 和 SPARC 的专门化fpic

编辑:阅读0x6adb015 引用的文档的第 11 页以及 coryan的评论后,我做了一些更改:

此选项仅对共享库有意义,并且您告诉操作系统您正在使用全局偏移表 GOT。这意味着您的所有地址引用都与 GOT 相关,并且代码可以跨多个进程共享。

否则,如果没有此选项,加载程序将不得不自己修改所有偏移量。

不用说,我们几乎总是使用 -fpic/PIC。

于 2009-06-08T21:10:12.317 回答
18

man gcc说:

-fpic
  生成适用于共享的位置无关代码 (PIC)
  库,如果目标机器支持的话。这样的代码访问所有
  通过全局偏移表 (GOT) 的常量地址。动态的
  loader 在程序启动时解析 GOT 条目(动态
  loader 不是 GCC 的一部分;它是操作系统的一部分)。如果
  链接的可执行文件的 GOT 大小超过了特定于机器的
  最大大小,您会从链接器收到一条错误消息,指示
  -fpic 不起作用;在这种情况下,请改用 -fPIC 重新编译。
  (这些最大值在 SPARC 上为 8k,在 m68k 和 RS/6000 上为 32k。
  386 没有这个限制。)

  与位置无关的代码需要特殊支持,因此
  仅适用于某些机器。对于 386,GCC 支持 PIC
  System V,但不适用于 Sun 386i。为
  IBM RS/6000 始终与位置无关。

-fPIC
  如果目标机器支持,则发出与位置无关的代码,
  适用于动态链接,并避免对大小的任何限制
  全局偏移表。此选项在 m68k 上有所不同
  和 SPARC。

  与位置无关的代码需要特殊支持,因此
  仅适用于某些机器。
于 2009-06-08T21:02:52.690 回答