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

问题描述

我正在构建一个共享库。我只需要其中的一个函数即可公开。

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

这让我问了很多问题:

  1. 我是否必须使用 -fPIC 重建这个动态库所需的每个目标文件和每个静态库?只有这样吗?

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

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

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

解决方法

  1. 您没有说明您使用的是哪个平台,但在 Linux 上,它是一个 requirement 来编译作为位置无关代码 (PIC) 进入您的库的目标文件。这至少包括 static libraries 中的 practice

  2. 是的。请参阅 load time relocation of shared librariesposition independent code pic in shared libraries

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...