【问题标题】:Linking a Static library into a shared library将静态库链接到共享库
【发布时间】:2016-07-22 17:01:39
【问题描述】:

我正在尝试在 Ubuntu Linux 上使用 g++ 5.4.0 创建一个共享库。

我已经构建了 Poco C++ 库的静态库(.a 文件),我想将它们静态链接到我的共享库中。

但它不起作用。

我已将以下字符串添加到我的构建脚本中:

-Wl,-whole-archive -lPocoFoundation -Wl,-no-whole-archive

g++ 报错如下:

relocation R_X86_64_32S against '-ZTVN4Poco15ArchiveStrategyE' can not be used when making a shared object; recompile with -fPIC

有人可以帮忙吗?

【问题讨论】:

    标签: linux gcc g++


    【解决方案1】:

    按照编译器的建议做:-fPIC重新编译

    解释:共享对象有这样的要求,即其代码中的地址不依赖于地址空间中二进制映像的内存布局。静态链接代码不受此约束,虚拟地址空间中的所有地址在链接时都是已知的,因此代码不需要处理在编译时未确定的位置。

    -fPIC 编译器标志允许编译Position I独立Code (PIC)。您尝试链接的静态库未编译为 PIC,这就是链接器抱怨的原因。解决办法是重新编译启用PIC的静态库。


    附带说明:PIC 也是地址空间布局随机化 (ASLR) 的基础,这是一种旨在使易受攻击的程序更难被利用的安全措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多