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

问题描述:

所以我一直在编码32位的东西,昨天我需要构建一个DLL,我遇到了一些问题。无论如何,我解决了他们here针对`.rodata'重新定位R_X86_64_32S ...在64位平台上编译

不幸的是,即使我认为一切都毕竟工作,我发现情况并非如此,当我提出我的程序,什么在64位上运行,你可以猜到发生了什么其他计算机上生成文件...

所以我的问题是有关,因为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 [email protected] $< ${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} 

我试图加-fPIC的CFLAGS,CPPFLAGS甚至LDFLAGS。我也试过在共享标志之前和之后添加-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. 

我读过所有的主题是什么与我的问题,甚至远程相似,但我我一直无法弄清楚这一点。

+4

非常感谢你提出并回答这个问题。现在如果只有人可以解释为什么添加“-shared”解决了它的问题...... – cmo 2013-01-18 21:49:37

+0

[什么是R \ _X86 \ _64 \ _32S和R \ _X86 \ _64 \ _64重定位是什么意思?](https:// *。 com/questions/6093547/what-do-r-x86-64-32s-and-r-x86-64-64-relocation-mean) – jww 2017-10-23 19:22:00

解决的办法是用-fPIC编译所有内容,并将共享对象与-shared链接起来。

-fPIC增加为CFLAGSCXXFLAGS用于基于制造的项目。

+1

你是指什么意思所有库?我有同样的问题:(请帮助我吗?我在创建.so文件的命令中使用了共享标记,我应该在其他地方使用它吗?!? – 2013-10-28 23:09:15

+1

我也不明白答案,请澄清它! :( – 2013-12-27 09:34:42

+1

澄清这个答案请 – Edeph 2014-07-01 10:36:04

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

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

试图编译XMLRPC-C-41年1月6日于CentOS 6.5,我也遇到相同的问题的连接,这是解决了以下内容: 在./src/cpp,我已经修改生成文件:线142至

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

关于国旗更多信息,可以发现link

+0

我遇到的问题非常相似,'/ usr/bin/ld:XmlRpcCpp.o:重新定位R_X86_64_32针对'.rodata'在制作共享对象时无法使用;使用-fPIC重新编译 XmlRpcCpp.o:无法读取符号:错误值 – Saeed 2014-05-26 18:20:00

+0

有时发生的情况是,当您运行-fPIC时,它会再次为某个子对象文件抛出此错误,只需备份该对象文件并再次运行make。你运行的是TotalSum.cpp,并且它引用了另一个文件CalculateSum.o,现在,错误出现在CalculateSum.o中,因此,还要备份CalculateSum.o并运行-fPIC,错误将消失。 – bgth 2015-07-18 11:09:19

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

使用-fPIC当comepile到.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/ 

如果这个问题加入“-fPIC”后仍然存在,尝试清除所有的.o文件,并再次运行