我知道 ' -fPIC
' 选项与解析地址和各个模块之间的独立性有关,但我不确定它的真正含义。你可以解释吗?
Sasha
问问题
66368 次
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 回答