构build共享库时,-fPIC意味着什么?

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

PIC代表位置独立代码

并引用man gcc

如果支持目标机器,则发出与位置无关的代码,适用于dynamic链接,并避免对全局偏移表的大小进行任何限制。 这个选项在m68k,PowerPC和SPARC上有所不同。 与位置无关的代码需要特殊的支持,因此只适用于某些机器。

在这些架构上构build共享对象(* .so)时使用。

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

PIC代表“位置独立代码”,是m68K和SPARC的fpic的专业化版本。

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

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

否则,如果没有这个选项,加载器将不得不修改所有的偏移本身。

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

man gcc说:

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

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

 -fPIC
  如果支持目标机器,则发出与位置无关的代码,
  适合dynamic链接,避免任何大小的限制
  全球抵消表。 这个选项在m68k上有所不同
  和SPARC。

  与位置无关的代码需要特殊的支持,因此
  只适用于某些机器。