CMake: wrong IMPLICIT_LINK_LIBRARIES when using clang AND sanitizers
When i try to compile darktable with -fsanitize=memory
, linking fails.
[ 18%] Linking C shared library libdarktable.so
/usr/bin/ld: error: /usr/lib/llvm-3.9/lib/clang/3.9.0/lib/linux/libclang_rt.msan_cxx-x86_64.a(msan_new_delete.cc.o): requires dynamic R_X86_64_PC32 reloc against '_ZN6__msan11msan_initedE' which may overflow at runtime; recompile with -fPIC
cmake call:
LDFLAGS="-fsanitize=memory" CFLAGS="${LDFLAGS}" CXXFLAGS="${LDFLAGS}" CPPFLAGS="${LDFLAGS}" CC=clang-3.9 CXX=clang++-3.9 cmake ../
make VERBOSE=1
shows that it tries to link to
/usr/lib/llvm-3.9/lib/clang/3.9.0/lib/linux/libclang_rt.msan_cxx-x86_64.a
BUT:
libclang_rt.msan_cxx-x86_64.a should not be linked to shared libraries.
https://llvm.org/bugs/show_bug.cgi?id=28485#c1
I'm looking into the cmake output, and looks like it thinks that libclang_rt.msan-x86_64.a should be linked implicitly:
$ grep -r libclang_rt
CMakeFiles/CMakeOutput.log: implicit libs: [/usr/lib/llvm-3.9/lib/clang/3.9.0/lib/linux/libclang_rt.msan-x86_64.a;/usr/lib/llvm-3.9/lib/clang/3.9.0/lib/linux/libclang_rt.msan_cxx-x86_64.a;stdc++;m;pthread;rt;m;dl;c]
CMakeFiles/3.5.2/CMakeCCompiler.cmake:set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "/usr/lib/llvm-3.9/lib/clang/3.9.0/lib/linux/libclang_rt.msan-x86_64.a;pthread;rt;m;dl;c")
LLVM bugreport: https://llvm.org/bugs/show_bug.cgi?id=28485