针对`.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.
我读过所有的主题是什么与我的问题,甚至远程相似,但我我一直无法弄清楚这一点。
解决的办法是用-fPIC
编译所有内容,并将共享对象与-shared
链接起来。
将-fPIC
增加为CFLAGS
或CXXFLAGS
用于基于制造的项目。
你是指什么意思所有库?我有同样的问题:(请帮助我吗?我在创建.so文件的命令中使用了共享标记,我应该在其他地方使用它吗?!? – 2013-10-28 23:09:15
我也不明白答案,请澄清它! :( – 2013-12-27 09:34:42
澄清这个答案请 – 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
我遇到的问题非常相似,'/ usr/bin/ld:XmlRpcCpp.o:重新定位R_X86_64_32针对'.rodata'在制作共享对象时无法使用;使用-fPIC重新编译 XmlRpcCpp.o:无法读取符号:错误值 – Saeed 2014-05-26 18:20:00
有时发生的情况是,当您运行-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文件,并再次运行
非常感谢你提出并回答这个问题。现在如果只有人可以解释为什么添加“-shared”解决了它的问题...... – cmo 2013-01-18 21:49:37
[什么是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