问题描述
共享库由几个目标文件和几个静态库构建而成。链接器抱怨一切都应该用 -fPIC
构建。所有目标文件和大多数静态库都是在没有这个选项的情况下构建的。
这让我问了很多问题:
-
我是否必须使用
-fPIC
重建这个动态库所需的每个目标文件和每个静态库?只有这样吗? -
链接器必须能够在链接期间静态地重新定位目标文件。正确的?否则,如果目标文件使用硬编码的常量地址,它们可能会相互重叠。这不应该意味着链接器拥有为每个目标文件创建全局偏移表所需的所有信息以及创建共享库所需的所有其他信息吗?
我目前正在 x86_64 上的 Linux 上工作,但我对任何平台的答案都很感兴趣。
解决方法
-
您没有说明您使用的是哪个平台,但在 Linux 上,它是一个 requirement 来编译作为位置无关代码 (PIC) 进入您的库的目标文件。这至少包括 static libraries 中的 practice。
-
是的。请参阅 load time relocation of shared libraries 和 position independent code pic in shared libraries。
-
我只在编译进入库的目标文件时使用
-fPIC
以避免不必要的 overhead。