C++ 构建共享库时 -fPIC 是什么意思?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/966960/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What does -fPIC mean when building a shared library?
提问by
I know the '-fPIC
' option has something to do with resolving addresses and independence between individual modules, but I'm not sure what it really means. Can you explain?
我知道 ' -fPIC
' 选项与解析地址和各个模块之间的独立性有关,但我不确定它的真正含义。你可以解释吗?
采纳答案by sean riley
PIC stands for Position Independent Code
PIC代表位置无关代码
and to quote man gcc
:
并引用man gcc
:
If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.
如果目标机器支持,则发出位置无关代码,适用于动态链接并避免对全局偏移表的大小进行任何限制。该选项在 m68k、PowerPC 和 SPARC 上有所不同。位置无关代码需要特殊支持,因此只能在某些机器上工作。
use this when building shared objects (*.so) on those mentioned architectures.
在那些提到的体系结构上构建共享对象 (*.so) 时使用它。
回答by Mark Beckwith
The f
is the gcc prefix for options that "control the interface conventions used
in code generation"
这f
是“控制代码生成中使用的接口约定”选项的 gcc 前缀
The PIC
stands for "Position Independent Code", it is a specialization of the fpic
for m68K and SPARC.
该PIC
代表“位置无关的代码”,它的一个专业化fpic
的M68K和SPARC。
Edit: After reading page 11 of the document referenced by 0x6adb015, and the comment by coryan, I made a few changes:
编辑:在阅读了 0x6adb015 引用的文档的第 11 页以及coryan的评论后,我做了一些更改:
This option only makes sense for shared libraries and you're telling the OS you're using a Global Offset Table, GOT. This means all your address references are relative to the GOT, and the code can be shared accross multiple processes.
此选项仅对共享库有意义,并且您告诉操作系统您正在使用全局偏移表 GOT。这意味着您所有的地址引用都与 GOT 相关,并且代码可以在多个进程之间共享。
Otherwise, without this option, the loader would have to modify all the offsets itself.
否则,如果没有这个选项,加载器将不得不自己修改所有的偏移量。
Needless to say, we almost always use -fpic/PIC.
不用说,我们几乎总是使用 -fpic/PIC。
回答by Nikolai Fetissov
man gcc
says:
man gcc
说:
-fpic Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.) Position-independent code requires special support, and therefore works only on certain machines. For the 386, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent. -fPIC If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k and the SPARC. Position-independent code requires special support, and therefore works only on certain machines.