小编典典

编译失败,“在创建共享库时,无法使用针对.rodata.str1.8的重定位R_X86_64_32”

linux

我正在尝试从VPS中的makefile编译此源代码,但无法正常工作。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

有人知道怎么了吗?


阅读 1125

收藏
2020-06-02

共1个答案

小编典典

执行编译器告诉您的操作,即使用进行重新编译-fPIC。要了解此标志的作用以及在这种情况下为什么需要此标志,请参阅GCC手册的
代码生成选项

简而言之,术语“ 位置无关代码”
(PIC)指的是与内存地址无关的生成的机器代码,即,不对将其加载到RAM中的位置进行任何假设。共享对象(SO)应该仅包含位置无关代码,因为它们应具有动态更改其在RAM中位置的能力。

最后,您也可以在 Wikipedia 上阅读有关它的信息。

2020-06-02