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”选项与解析各个模块之间的地址和独立性有关,但我不确定它的真正含义。你能解释一下吗?
3 个解决方案
#1
48
PIC stands for Position Independent Code
PIC表示位置无关的代码
and to quote man gcc
:
引用人类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)时使用此方法。
#2
23
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代表“位置无关码”,是m68K和SPARC fpic的一种专门化。
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.
这个选项只适用于共享库,您告诉操作系统您正在使用全局偏移表,get。这意味着所有的地址引用都是相对于get的,并且代码可以共享多个进程。
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。
#3
15
man gcc
says:
男人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.
#1
48
PIC stands for Position Independent Code
PIC表示位置无关的代码
and to quote man gcc
:
引用人类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)时使用此方法。
#2
23
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代表“位置无关码”,是m68K和SPARC fpic的一种专门化。
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.
这个选项只适用于共享库,您告诉操作系统您正在使用全局偏移表,get。这意味着所有的地址引用都是相对于get的,并且代码可以共享多个进程。
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。
#3
15
man gcc
says:
男人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.