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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 18:09:28  来源:igfitidea点击:

What does -fPIC mean when building a shared library?

c++cgccfpic

提问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 fis the gcc prefix for options that "control the interface conventions used in code generation"

f是“控制代码生成中使用的接口约定”选项的 gcc 前缀

The PICstands for "Position Independent Code", it is a specialization of the fpicfor 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 gccsays:

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.