“relocation R_X86_64_32S against ” linking Error

前端 未结 5 1816
被撕碎了的回忆
被撕碎了的回忆 2020-11-28 04:23

I\'m Trying to Link a static Library to a shared library , I\'m Getting the Following error

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o         


        
相关标签:
5条回答
  • 2020-11-28 04:40

    Add -fPIC at the end of CMAKE_CXX_FLAGS and CMAKE_C_FLAG

    Example:

    set( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Wall --std=c++11 -O3 -fPIC" )
    set( CMAKE_C_FLAGS  "${CMAKE_C_FLAGS} -Wall -O3 -fPIC" )
    

    This solved my issue.

    0 讨论(0)
  • 2020-11-28 04:54

    Assuming you are generating a shared library, most probably what happens is that the variant of liblog4cplus.a you are using wasn't compiled with -fPIC. In linux, you can confirm this by extracting the object files from the static library and checking their relocations:

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

    If the output is empty, then the static library is not position-independent and cannot be used to generate a shared object.

    Since the static library contains object code which was already compiled, providing the -fPIC flag won't help.

    You need to get ahold of a version of liblog4cplus.a compiled with -fPIC and use that one instead.

    0 讨论(0)
  • 2020-11-28 04:54

    I've got a similar error when installing FCL that needs CCD lib(libccd) like this:

    /usr/bin/ld: /usr/local/lib/libccd.a(ccd.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC

    I find that there is two different files named "libccd.a" :

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

    I solved the problem by removing the first file.

    0 讨论(0)
  • 2020-11-28 04:57

    Relocation R_X86_64_PC32 against undefined symbol , usually happens when LDFLAGS are set with hardening and CFLAGS not .
    Maybe just user error:
    If you are using -specs=/usr/lib/rpm/redhat/redhat-hardened-ld at link time, you also need to use -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 at compile time, and as you are compiling and linking at the same time, you need either both, or drop the -specs=/usr/lib/rpm/redhat/redhat-hardened-ld . Common fixes :
    https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
    https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

    0 讨论(0)
  • 2020-11-28 04:58

    I also had similar problems when trying to link static compiled fontconfig and expat into a linux shared object:

    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /3rdparty/fontconfig/lib/linux-x86_64/libfontconfig.a(fccfg.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
    /opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /3rdparty/expat/lib/linux-x86_64/libexpat.a(xmlparse.o): relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
    [...]
    

    This contrary to the fact that I was already passing -fPIC flags though CFLAGS variable, and other compilers/linkers variants (clang/lld) were perfectly working with the same build configuration. It ended up that these dependencies control position-independent code settings through despicable autoconf scripts and need --with-pic switch during build configuration on linux gcc/ld combination, and its lack probably overrides same the setting in CFLAGS. Pass the switch to configure script and the dependencies will be correctly compiled with -fPIC.

    0 讨论(0)
提交回复
热议问题