g 编译错误:\`.rodata' 不能在创建共享对象时使用;使用 -fPIC 重新编译

新手上路,请多包涵

我正在使用命令:

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

我已经看到了线程: 编译失败,“在制作共享对象时无法使用针对 `.rodata.str1.8’ 的重定位 R_X86_64_32”

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

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

提前致谢

原文由 Polymer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

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

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

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

原文由 davmac 发布,翻译遵循 CC BY-SA 4.0 许可协议

/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

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

(其他人质疑为什么需要构建 PIE 目标,因为它不是共享库。在 Debian 9 中,GCC 默认生成 PIE 可执行文件,无论是程序还是共享库。Ubuntu 17.04 也是如此。)

原文由 Mike Kinghan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题