Relocation R_X86_64_PC32 against undefined symbol can not be used when making a shared object; recompile with -fPIC

那年仲夏 提交于 2019-12-13 03:19:15

问题


I recently upgraded gSOAP from 2.8.7 to 2.8.76. I had to make a few minor code adjustments for the upgrade, but after the upgrade the code won't link on the computer it would before.

I'm trying to use gSOAP to create a shared library on a computer which uses g++ 4.9.2. I've condensed the code down to create a test case that simplifies things a bit to try to identify where the failure is occurring.

gSOAP generates some ebaySoapLib* files when I run:

/usr/local/bin/soapcpp2 -z1 -C -w -x -n -pebaySoapLib -qebaySoapLib -I/usr/local/include/gsoap:/usr/local/share/gsoap:/usr/local/share/gsoap/import ebaySvc.h

The -z1 option is to keep things similar to how they were with gSOAP 2.8.7.

If I run:

g++  -fPIC -c ebaySoapLibClientLib.cpp
g++  -shared -fPIC -o test.so ebaySoapLibClientLib.o

I get the error:

/usr/bin/ld: ebaySoapLibClientLib.o: relocation R_X86_64_PC32 against
undefined symbol `soap_serializeheader' can not be used when making a
shared object; recompile with -fPIC

/usr/bin/ld: final link failed: Bad value

collect2: error: ld returned 1 exit status

I copied over the exact files to another computer running g++ 6.3.0 (not sure that the compiler version is what is mattering or now), and this compiles and links fine.

The file ebaySoapLibClientLib.cpp contains:

#define SOAP_FMAC3 static
#include "ebaySoapLibC.cpp"
#include "ebaySoapLibClient.cpp"

Now, if I remove the line:

#define SOAP_FMAC3 static

then the code compiles fine on both computers.

I'm at a loss for what I need to do differently to make it link OK with the g++ 4.9.2 computer. I could take out the #define so the functions aren't defined static and get it to work, but the question is WHY as gSOAP is putting it in there for a reason, and it links fine on the g++ 6.3.0 with these functions set to static.


回答1:


You need to get library that supplies soap_serializeheader to be compile ready for shared library, its not ebaySoaLibClientLib.cpp. Use g++ -v to see what libraries g++ is using. Try using shared library instead of static ones.



来源:https://stackoverflow.com/questions/54471287/relocation-r-x86-64-pc32-against-undefined-symbol-can-not-be-used-when-making-a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!