构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。 与位置无关的代码需要特殊的支持,因此 只适用于某些机器。