在构建共享库时-fPIC是什么意思?

时间:2022-09-18 12:26:19

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.