g++编译错误:制作共享对象时无法使用`.rodata';请使用-fPIC重新编译。

27
我正在使用以下命令:
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系统上进行编译,那里可以正常工作。我认为可能缺少某些依赖项,但我一直找不到答案。

提前致谢


1
你是如何编译 main-parser.o 的? - Daniel Trugman
如果没有使用-fPIC,那可能会解释这个错误... - Daniel Trugman
1
我在不使用-fPIC的情况下也收到了相同的错误信息。 - Polymer
1
你是在尝试构建共享对象吗?你的命令行中似乎没有任何与共享对象相关的内容。 - n. m.
我真的无法告诉你它是如何编译的,因为我们没有得到那些信息,源代码已经为我们预编译好了。是的,g++ --std=c++11 -fPIC -Iincludes -o jparser parser.cpp lib/main-parser.o lib/lib.a 是整个输入。我目前正在尝试在Debian 8全新安装上运行相同的代码(谁知道呢)。 - Polymer
显示剩余4条评论
3个回答

36

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

作为看起来,gcc正试图创建一个“位置无关可执行文件”,请告诉它不要这样做:

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

看起来您的系统默认使用 g++ 生成位置无关可执行文件。其他系统则需要使用 -pie 来实现这一点。使用 -no-pie 应该创建一个“常规”的(位置相关的)可执行文件。

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


2
我确认将-no-pie添加到链接选项中是可行的。 - Claudio

10
/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也是如此。)

你好,我遇到了这个问题,不知道如何构建和使用PIC。你能帮忙解决一下吗?https://stackoverflow.com/questions/52499568/relocation-r-x86-64-32-against-xxx-can-not-be-used-when-making-a-shared-object - Felipe
引用Debian文档的话:“请注意,即使错误消息显示-fPIC,重新编译时使用-fPIE就足够了(这是stretch中的GCC 6软件包的默认设置)。” - Beni Cherniavsky-Paskin

1

加上这个对我有用。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接