针对".rodata"的搬迁R_X86_64_32S...在 64 位平台上编译时

Relocation R_X86_64_32S against `.rodata' ... While compiling on 64-bit platform

本文关键字:编译 32S 平台 X86 rodata 针对      更新时间:2023-10-16

所以我一直在用32位编码,昨天我需要构建一个dll,但我遇到了一些问题。不管怎样,我在这里解决了它们。

不幸的是,即使我认为一切都在工作,但当我在其他运行64位的计算机上移动程序和makefile时,我发现情况并非如此,你可以猜到发生了什么。。。

所以我的问题与64位的重新定位有关

/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value

这是我的makefile

MyProgram: main.o chkopts
    -${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
    ${RM} main.o
    export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH
LibMyProgram.so: MyClass.o  chkopts
    -${CLINKER}  -shared -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}
    mv ${VERS} ${LIBADD}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
    ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}

我尝试在CFLAGS、CPPFLAGS甚至LDFLAGS中添加-fPIC。我还尝试在共享标志之前和之后添加-fPIC。

-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS}   *.o  ${PETSC_MAT_LIB}

但我会得到和以前一样的错误。

如果我使用CFLAGS=-fPIC,我会得到一个类似的错误,即:

.../petsc/petsc-3.2-p6/arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation R_X86_64_32 against `ompi_mpi_comm_self' can not be used when making a shared object; recompile with -fPIC.

我读过所有与我的问题极其相似的话题,但我一直无法弄清楚。

当我试图创建一个需要链接静态库的共享库时,我遇到了同样的问题。

我通过在CXXFLAGS中添加-fPIC来编译归档在静态库中的.o文件,从而解决了这个问题。

解决方案是用-fPIC编译所有内容,并用-shared链接共享对象。

对于基于制造的项目,将-fPIC添加到CFLAGSCXXFLAGS

试图在CentOS 6.5中编译xmlrpc-c-1.06.41时,我遇到了同样的链接问题,通过以下方法解决了这个问题:在/src/cpp,我已经将Makefile:第142行修改为

CXXFLAGS = $(CXXFLAGS_COMMON) $(CFLAGS_PERSONAL) $(CADD) -shared -fPIC

有关标志的更多信息,请链接

如果添加"-fPIC"后仍然存在此问题,请尝试清理所有.o文件,然后再次运行

我也遇到了这个问题。正如我尝试使用@Mare和@user2391685所说,它可以很好地工作:

当comepile到.o文件时使用-fPIC:例如:

gcc -Wall -fPIC -c hello.c -I./ -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/

然后您可以构建一个.so文件:

gcc -Wall -rdynamic -shared -o libhello.so hello.o Main.h -I/usr/lib/jvm/java/include/ -I/usr/lib/jvm/java/include/linux/

这件作品很有魅力。对于谁还不知道这个容易使用的

一个名为Makefile.amMakefile的打开文件。根据您的配置。

查看此_a_CXXFLAGS=或仅CXXFLAGS=的代码

之后添加文件-共享-fPIC

这个例子

之前

crypto_libmubdi_crypto_a_CXFLAGS=$(AM_CXXFLAGS)$(PIC_FLAGS)$

之后

crypto_libmubdi_crypto_a_CXFLAGS=$(AM_CXXFLAGS)$(PIC_FLAGS)$

这些错误导致我们没有将共享文件或需要-fPIC字符串/标签。

注:我的经验是建立我的区块链。这个原因添加了这个crypto/sph_sha2big.c

命令行中:

cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"

或者在CMakeList.txt:中

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie")

针对未定义符号重新定位R_X86_64_PC32,通常发生在LDFLAGS设置为硬化而CFLAGS未设置时。当configure.ac用CFLAGS=";某事";则需要将其更改为CFLAGS+="0";某事";

https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patchhttps://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3