gcc 编译失败,出现“创建共享对象时,无法使用针对`.rodata.str1.8'的重定位R_X86_64_32”

nfzehxib  于 2023-04-06  发布在  其他
关注(0)|答案(9)|浏览(273)

我试图编译这个源代码从makefile在一个VPS,但它不工作。VPS是一个64美分的操作系统
这里是完整的错误

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

这是我的makefile:

GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

有人知道出什么事了吗?

lp0sw83n

lp0sw83n1#

按照编译器的指示去做,即用-fPIC重新编译。要了解这个标志的作用以及为什么在这种情况下需要它,请参阅GCC手册中的代码生成选项
简单地说,术语位置无关代码(PIC)指的是生成的机器码,它是内存地址不可知的,即不对它被加载到RAM中的位置做任何假设。只有位置无关代码应该被包含在共享对象(SO)中,因为它们应该有能力动态地改变它们在RAM中的位置。
最后,你也可以在**Wikipedia**上阅读它。

t1rydlwq

t1rydlwq2#

在我的例子中,这个错误是因为make命令期望从LDFLAGS环境变量指示的远程目录中获取共享库(*.so文件)。在一个错误中,只有静态库(*.la*.a文件)可用。
因此,我的问题并不在于我正在编译的程序,而在于它试图获取的远程库。因此,我不需要向因重定位错误而中断的编译添加任何标志(例如,-fPIC)。相反,我重新编译了远程库,以便共享对象可用。

基本上,这是一个伪装的文件未找到错误。

在我的例子中,我不得不在必要程序的configure调用中删除一个错位的--disable-shared开关,因为共享库和静态库都是默认构建的。
我注意到大多数程序同时构建这两种类型的库,所以我的可能是一个角落的情况。一般来说,可能是这样的情况,你宁愿启用共享库,这取决于默认值。
为了检查您使用编译开关和默认值的特定情况,我会阅读./configure --help | less的摘要,通常在可选功能部分。我经常发现这种阅读比依赖程序发展时不更新的安装指南更可靠。

8qgya5xd

8qgya5xd3#

在链接器阶段使用-no-pie选项修复了它:

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...
vptzau2j

vptzau2j4#

这并不总是关于编译标志,我在使用distcc时在gentoo上也有同样的错误。
原因是distcc服务器上使用的是未硬化的配置文件,而客户端上的配置文件是硬化的。请查看以下讨论:https://forums.gentoo.org/viewtopic-p-7463994.html

ohtdti5x

ohtdti5x5#

简单地清理项目为我解决了它。
我的项目是一个C++应用程序(不是共享库)。我在大量成功构建后随机得到了这个错误。

qxgroojn

qxgroojn6#

我遇到了同样的问题。尝试使用-fPIC标志重新编译。

f0ofjuux

f0ofjuux7#

我得到的解决方案与@camino对https://stackoverflow.com/a/19365454/10593190XavierStuvw's reply的评论相同。
我让它工作(安装ffmpeg),只需重新安装整个事情从一开始与所有示例的$ ./configure替换为$ ./configure --enable-shared(首先确保删除所有文件夹和文件,包括.so文件从以前的尝试)。
显然,这是因为https://stackoverflow.com/a/13812368/10593190

fgw7neuy

fgw7neuy8#

我们遇到了同样的问题。原来是Makefile中的一个混淆。当链接器是gcc时发生错误,但C++编译器clang++。将链接器更改为clang++修复了它。

6mzjoqzu

6mzjoqzu9#

我知道这个查询是一年前提出的。我在我的系统中尝试了给定的错误。我尝试使用Make file提供此错误来模拟给定的错误。错误Make file(每行使用制表符而不是多个空格开始):

all:
    @echo "/usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c";\
    /usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c;\
    echo "/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp";\
    /usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp;\
    echo "/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp";\
    /usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp;\
    echo "/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o";\
    /usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o

错误:

/usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
  /usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
  /usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
  /usr/bin/g++ -O2 -shared -o TCP_V1.so *.o
  /usr/bin/ld: one.o: relocation R_X86_64_32 against `.rodata.str1.1'
  can not be used when making a shared object; recompile with -fPIC
  one.o: error adding symbols: Bad value
  collect2: error: ld returned 1 exit status

已更新Make文件:

all:
      @echo "/usr/bin/gcc -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c";\
      /usr/bin/gcc -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c;\
      echo "/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp";\
      /usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp;\
      echo "/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp";\
      /usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp;\
      echo "/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o";\
      /usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o

相关问题