【问题标题】:g++ compile error: `.rodata' can not be used when making a shared object; recompile with -fPICg++ 编译错误:`.rodata' 不能在制作共享对象时使用;使用 -fPIC 重新编译
【发布时间】:2018-03-31 08:18:36
【问题描述】:

我正在使用命令:
g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a

在 Debian 9 上编译 C++ 程序。但我收到以下错误消息: /usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status

我已经看过这个帖子了: Compilation fails with "relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object"

但是,我尝试添加 -fPIC 参数,但奇怪的是它给出了相同的错误消息,以及“使用 -fPIC 重新编译”

任何想法将不胜感激。我试过在我大学的 RedHat 系统上编译它,它在那里工作得很好。我认为这可能是缺少依赖项,但我一直找不到任何答案。

提前致谢

【问题讨论】:

  • 你是如何编译 main-parser.o 的?
  • 很遗憾,我无法提供这方面的信息,因为它是预编译的,我们没有收到关于它是如何编译的信息
  • 如果没有使用过-fPIC,它可以解释错误...
  • 我在不使用-fPIC 的情况下也收到相同的错误消息
  • 您是否正在尝试构建共享对象?您的命令行中似乎没有任何相关的共享对象。

标签: c++ c++11 g++


【解决方案1】:

看起来 gcc 正在尝试生成与位置无关的可执行文件(“共享对象”是提示),告诉它不要这样做:

g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a

似乎g++ 在您的系统上默认生成与位置无关的可执行文件。其他系统需要-pie 才能这样做。使用-no-pie 应该会创建一个“常规”(取决于位置)可执行文件。

(该错误是由于尝试将编译为非位置无关的目标文件链接到应该是位置无关的可执行文件的结果)。

【讨论】:

  • 我确认将-no-pie 添加到链接选项是有效的。
【解决方案2】:
/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' \
can not be used when making a shared object; recompile with -fPIC

此链接器错误告诉您目标文件 csdocument.o 在 静态库lib/lib.a 不是位置无关代码,因此 无法与您的 PIE 程序链接。所以需要重新编译源码 lib/lib.a-fPIC 的文件,然后重建静态库,然后链接 它与您的 PIE 程序。如果您无法控制库源 然后向其供应商请求 PIC 构建。

(其他人质疑为什么您需要构建 PIE 目标 因为它不是共享库。在 Debian 9 中,GCC 产生PIE executables by default, 无论是程序还是共享库。从 17.04 开始,Ubuntu 也是如此。 )

【讨论】:

  • 嗨,我遇到了这个问题,我不知道如何获取 PIC 版本并使用它。你能帮忙解答我的问题吗? stackoverflow.com/questions/52499568/…
  • 引用 Debian 文档:“请注意,即使错误消息显示 -fPIC,使用 -fPIE 重新编译就足够了(这是 GCC 6 软件包中的默认值,它是拉伸的一部分)。”
【解决方案3】:

添加这个对我有用。

g++ --std=c++11 -no-pie

我还添加了-fPIC 来编译标志。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多