“重新安置R_X86_64_32S”链接错误

我试图将静态库链接到共享库,我得到以下错误

 / usr / bin / ld:../../../libraries/log4cplus/liblog4cplus.a(fileappender.o):重新定位R_X86_64_32S在创build共享对象时不能使用“本地符号”; 用-fPIC重新编译
 ../../../libraries/log4cplus/liblog4cplus.a:无法读取符号:错误值
 collect2:ld返回1退出状态

但是这在32位机器上工作没有任何这样的错误。 我尝试手动添加-fPIC标志到Makefile也没有解决问题

我尝试了这里build议的-whole-archive标志,但没有成功。

 
 / usr / bin / ld:../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o):重新定位R_X86_64_32S针对vtable for log4cplus :: spi :: AppenderAttachable不能用于制作共享对象; 用-fPIC重新编译
 ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o):无法读取符号:错误的值
 collect2:ld返回1退出状态

创buildliblog4cplus.a:

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile并将-fPIC添加到CXXFLAGS和CFLAGS
  4. make

然后编译我的共享库:

  1. g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl

假设你正在生成一个共享库,最可能发生的是你正在使用的liblog4cplus.a的变体没有用-fPIC编译。 在linux中,您可以通过从静态库中提取目标文件并检查其重定位来确认 :

 ar -x liblog4cplus.a readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)' 

如果输出为空,则静态库不是位置独立的,不能用于生成共享对象。

由于静态库包含已编译的目标代码,因此提供-fPIC标志将无济于事。

您需要获取使用-fPIC编译的liblog4cplus.a版本,然后使用该版本。

安装需要CCD lib(libccd)的FCL时,出现类似的错误:

/ usr / bin / ld:/usr/local/lib/libccd.a(ccd.o):在创build共享对象时,不能使用R_X86_64_32S针对“本地符号”; 用-fPIC重新编译

我发现有两个不同的文件名为“libccd.a”:

  1. /usr/local/lib/libccd.a
  2. /usr/local/lib/x86_64-linux-gnu/libccd.a

我通过删除第一个文件来解决问题。

对未定义符号进行重定位R_X86_64_PC32通常在LDFLAGS设置为硬化且CFLAGS未设置时发生。
也许只是用户错误:
如果在链接时使用-specs = / usr / lib / rpm / redhat / redhat-hardened-ld,则还需要在编译时使用-specs = / usr / lib / rpm / redhat / redhat- ,并且在编译和链接的同时,还需要两者,或者删除-specs = / usr / lib / rpm / redhat / redhat-hardened-ld。 常见的修复:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch