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

Pol*_*mer 14 c++ g++ c++11

我正在使用命令:
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

我已经看过线程了: 编译失败时"在制作共享对象时不能使用"重定位R_X86_64_32对`.rodata.str1.8'"

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

任何想法,将不胜感激.我已经尝试在我的大学的RedHat系统上编译它,它在那里工作正常.我认为这可能是一个缺失的依赖,但我一直无法找到任何答案.

提前致谢

dav*_*mac 21

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

g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a
Run Code Online (Sandbox Code Playgroud)

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

  • 我确认将 `-no-pie` 添加到链接选项有效。 (2认同)

Mik*_*han 7

/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
Run Code Online (Sandbox Code Playgroud)

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

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