重定位R_X86_64_32S对`.rodata'...在64位平台上进行编译

时间:2012-03-09 16:28:37

标签: c++ g++ 32bit-64bit

所以我一直在编写32位的内容,昨天我需要构建一个dll而且我遇到了一些问题。无论如何,我解决了他们here

不幸的是,即使我认为一切都在运行,我发现当我在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。我还尝试在-shared标志之前和之后添加-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.

我已经阅读了与我的问题甚至远远相似的所有主题,但我一直无法解决这个问题。

7 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

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

为基于生成的项目添加-fPICCFLAGSCXXFLAGS

答案 2 :(得分:4)

尝试在CentOS 6.5中编译xmlrpc-c-1.06.41,遇到了相同的链接问题,该问题由以下内容解决: 在./src/cpp中,我修改了Makefile:第142行到

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

有关标志的更多信息可以在link

找到

答案 3 :(得分:2)

如果在添加“-fPIC”后仍然存在此问题,请尝试清除所有.o文件,然后重新运行

答案 4 :(得分:1)

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

在发送到-fPIC文件时使用.o: 例如:

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/

答案 5 :(得分:0)

这是一种魅力。对于谁还不知道这个简单易用的人

一个名为 Makefile.am Makefile 的打开文件。只需完成您的配置即可。

在此代码 _a_CXXFLAGS = 或只是 CXXFLAGS =

在该文件 -shared -fPIC

之后添加

此示例

之前

crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS)$(PIC_FLAGS)$(CXXFLAGS_COMMON)$(CFLAGS_PERSONAL)$(CADD)

之后

crypto_libmubdi_crypto_a_CXXFLAGS = $(AM_CXXFLAGS)$ {PIC_FLAGS)$ {CXXFLAGS_COMMON)$ {CFLAGS_PERSONAL)$ {CADD)-共享-fPIC

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

注意:我在构建区块链方面经验丰富。这导致添加了crypto / sph_sha2big.c

答案 6 :(得分:0)

命令行中:

cmake -DCMAKE_EXE_LINKER_FLAGS="-no-pie"

或者在 CMakeList.txt 中:

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