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

时间:2017-10-19 10:05:01

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

我正在使用命令:
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系统上编译它,它在那里工作正常。我认为这可能是一个缺失的依赖,但我一直找不到任何答案。

提前致谢

3 个答案:

答案 0 :(得分:14)

由于gcc似乎正在尝试生成与位置无关的可执行文件,请告诉它不要:

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

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

答案 1 :(得分:6)

/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计划。如果您无法控制libary源 然后从供应商那里请求PIC构建。

(其他人质疑为什么你需要建立一个PIE目标 因为它不是共享库。在Debian 9中,GCC生成PIE executables by default, 无论是程序还是共享库。 Ubuntu截至17.04也是如此。 )

答案 2 :(得分:0)

添加它对我有用。

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

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