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

发布于 2024-07-23 19:48:38 字数 72 浏览 13 评论 0原文

我知道“-fPIC”选项与解析地址和各个模块之间的独立性有关,但我不确定它的真正含义。 你可以解释吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

轮廓§ 2024-07-30 19:48:39

PIC 代表位置无关代码。

引用man gcc

如果目标机器支持,则发出与位置无关的代码,适合动态链接并避免对全局偏移表大小的任何限制。 此选项在 AArch64、m68k、PowerPC 和 SPARC 上有所不同。

在上述架构上构建共享对象 (*.so) 时使用此选项。

PIC stands for Position Independent Code.

To quote 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 AArch64, m68k, PowerPC and SPARC.

Use this when building shared objects (*.so) on those mentioned architectures.

飘然心甜 2024-07-30 19:48:39

f 是“控制所使用的接口约定”选项的 gcc 前缀
编辑

PIC 代表“位置无关代码”,它是 m68K 和 SPARC 的 fpic 的特化。

:阅读了 0x6adb015引用的文档,以及coryan的评论,我做了一些更改:

此选项仅使对于共享库来说,您告诉操作系统您正在使用全局偏移表,GOT,这意味着您的所有地址引用都是相对于 GOT 的,并且代码可以在多个进程之间共享,

否则,如果没有此选项, 加载器必须自己修改所有偏移量,我们几乎总是使用 -fpic/PIC。

不用说,

The f is the gcc prefix for options that "control the interface conventions used
in code generation"

The PIC stands for "Position Independent Code", it is a specialization of the fpic for m68K and SPARC.

Edit: After reading page 11 of the document referenced by 0x6adb015, and the comment by coryan, I made a few changes:

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.

Otherwise, without this option, the loader would have to modify all the offsets itself.

Needless to say, we almost always use -fpic/PIC.

中性美 2024-07-30 19:48:39

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.

man gcc says:

-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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文