“重新安置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:
-
unzip log4cplus-1.1.0.zip
-
./configure --enable-static=yes --enable-threads=yes
-
vi Makefile
并将-fPIC添加到CXXFLAGS和CFLAGS -
make
然后编译我的共享库:
-
g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
-
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”:
- /usr/local/lib/libccd.a
- /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