是否所有可能最终出现在共享库中的东西都需要使用 -fPIC 进行编译?

Does everything that may end up in a shared library always need to be compiled with -fPIC?

我正在构建共享库。我只需要其中一个函数是 public.

共享库由几个目标文件和几个静态库构建而成。链接器抱怨一切都应该用 -fPIC 构建。所有目标文件和大多数静态库都是在没有此选项的情况下构建的。

这让我问了很多问题:

  1. 我是否必须使用 -fPIC 重建此动态库所需的每个目标文件和每个静态库?这是唯一的方法吗?

  2. 链接器必须能够在链接期间静态重定位目标文件。正确的?否则,如果目标文件使用硬编码的常量地址,它们可能会相互重叠。这不应该意味着链接器拥有为每个目标文件创建全局偏移量 table 所需的所有信息以及创建共享库所需的所有其他信息吗?

  3. 我是否应该始终将 -fPIC 作为默认选项用于将来的所有内容,以防某天动态库可能需要某些东西?

我目前正在 x86_64 上研究 Linux,但我对任何平台的答案都很感兴趣。

  1. 您没有说您使用的是哪个平台,但在 Linux 上是 requirement to compile object files that go into your library as position independent code (PIC). This includes static libraries at least in

  2. 是的。参见 load time relocation of shared libraries and position independent code pic in shared libraries

  3. 我只在编译进入库的目标文件时使用 -fPIC 以避免不必要的 overhead.