Linking on my SLES 12 machine against LLVM fails because of ABI changes. I built LLVM myself. I tried using g++ as well as clang++ to build mull, but linking always fails, seemingly with relation to finding string related functions:
[92/92] Linking CXX executable unittests/MullUnitTests
FAILED: : && /usr/local/bin/clang++ -D_GLIBCXX_USE_CXX11_ABI=1 -D_GLIBCXX_USE_CXX11_ABI=1 -L/usr/local/lib -Wl,-undefined,dynamic_lookup -rdynamic -ldl unittests/CMakeFiles/MullUnitTests.dir/CompilerTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/ConfigParserTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/ContextTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/DriverTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/ForkProcessSandboxTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/MutationPointTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/ModuleLoaderTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/DynamicCallTreeTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/MutatorsFactoryTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/TesteesTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/TestRunnersTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/UniqueIdentifierTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/TaskExecutorTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/Mutators/MutatorsTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/Mutators/NegateConditionMutatorTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/Mutators/RemoveVoidFunctionMutatorTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/Mutators/ScalarValueMutatorTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/Mutators/ConditionalsBoundaryMutatorTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/JunkDetection/CXXJunkDetectorTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/SimpleTest/SimpleTestFinderTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/GoogleTest/GoogleTestFinderTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/CustomTestFramework/CustomTestRunnerTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/CustomTestFramework/CustomTestFinderTests.cpp.o unittests/CMakeFiles/MullUnitTests.dir/SQLiteReporterTest.cpp.o unittests/CMakeFiles/MullUnitTests.dir/TestModuleFactory.cpp.o -o unittests/MullUnitTests lib/libmull.a googletest/libgoogle-test.a -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMBitWriter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMOrcJIT -lLLVMTransformUtils -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMC -lLLVMAsmParser -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -pthread /usr/lib64/libz.so -lncurses /usr/lib64/libsqlite3.so -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMBitWriter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMOrcJIT -lLLVMTransformUtils -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMC -lLLVMAsmParser -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -Wl,--start-group /usr/local/lib/libclang.so /usr/local/lib/libclangTooling.a /usr/local/lib/libclangBasic.a /usr/local/lib/libclangFrontend.a /usr/local/lib/libclangAST.a /usr/local/lib/libclangDriver.a /usr/local/lib/libclangLex.a /usr/local/lib/libclangSema.a /usr/local/lib/libclangSerialization.a /usr/local/lib/libclangAnalysis.a /usr/local/lib/libclangParse.a /usr/local/lib/libclangEdit.a -Wl,--end-group && cd /home/def/git/mull/BuildNinja/unittests && /home/def/.HappyMake/cache/dependencies/newdb/cmake-3.11.0-sap2-linuxx86_64-linuxx86_64/bin/cmake -E create_symlink /home/def/git/mull/unittests/fixtures /home/def/git/mull/BuildNinja/unittests/fixtures
unittests/CMakeFiles/MullUnitTests.dir/CompilerTests.cpp.o: In function `Compiler_CompileModule_Test::TestBody()':
CompilerTests.cpp:(.text._ZN27Compiler_CompileModule_Test8TestBodyEv+0x164): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
unittests/CMakeFiles/MullUnitTests.dir/TestRunnersTests.cpp.o: In function `SimpleTestRunner_runTest_Test::TestBody()':
TestRunnersTests.cpp:(.text._ZN29SimpleTestRunner_runTest_Test8TestBodyEv+0x164): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
lib/libmull.a(ConfigParser.cpp.o): In function `_ZN4llvm4yaml7yamlizeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENSt9enable_ifIXsr16has_ScalarTraitsIT_EE5valueEvE4typeERNS0_2IOERS9_bRNS0_12EmptyContextE':
ConfigParser.cpp:(.text._ZN4llvm4yaml7yamlizeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENSt9enable_ifIXsr16has_ScalarTraitsIT_EE5valueEvE4typeERNS0_2IOERS9_bRNS0_12EmptyContextE[_ZN4llvm4yaml7yamlizeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENSt9enable_ifIXsr16has_ScalarTraitsIT_EE5valueEvE4typeERNS0_2IOERS9_bRNS0_12EmptyContextE]+0x88): undefined reference to `llvm::yaml::ScalarTraits<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::output(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, void*, llvm::raw_ostream&)'
ConfigParser.cpp:(.text._ZN4llvm4yaml7yamlizeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENSt9enable_ifIXsr16has_ScalarTraitsIT_EE5valueEvE4typeERNS0_2IOERS9_bRNS0_12EmptyContextE[_ZN4llvm4yaml7yamlizeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEENSt9enable_ifIXsr16has_ScalarTraitsIT_EE5valueEvE4typeERNS0_2IOERS9_bRNS0_12EmptyContextE]+0x208): undefined reference to `llvm::yaml::ScalarTraits<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::input(llvm::StringRef, void*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
lib/libmull.a(Driver.cpp.o): In function `llvm::sys::DynamicLibrary::LoadLibraryPermanently(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)':
Driver.cpp:(.text._ZN4llvm3sys14DynamicLibrary22LoadLibraryPermanentlyEPKcPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN4llvm3sys14DynamicLibrary22LoadLibraryPermanentlyEPKcPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x19): undefined reference to `llvm::sys::DynamicLibrary::getPermanentLibrary(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
lib/libmull.a(Toolchain.cpp.o): In function `mull::Toolchain::Toolchain(mull::Config&)':
Toolchain.cpp:(.text._ZN4mull9ToolchainC2ERNS_6ConfigE+0x16c): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
lib/libmull.a(CXXJunkDetector.cpp.o): In function `getCompilationDatabase(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
CXXJunkDetector.cpp:(.text._ZL22getCompilationDatabaseRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x95): undefined reference to `clang::tooling::CompilationDatabase::loadFromDirectory(llvm::StringRef, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
lib/libmull.a(InstrumentedCompilationTask.cpp.o): In function `mull::InstrumentedCompilationTask::operator()(__gnu_cxx::__normal_iterator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > const*, std::vector<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> >, std::allocator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > const*, std::vector<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> >, std::allocator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > > > >, std::vector<llvm::object::OwningBinary<llvm::object::ObjectFile>, std::allocator<llvm::object::OwningBinary<llvm::object::ObjectFile> > >&, mull::progress_counter&)':
InstrumentedCompilationTask.cpp:(.text._ZN4mull27InstrumentedCompilationTaskclEN9__gnu_cxx17__normal_iteratorIPKSt10unique_ptrINS_10MullModuleESt14default_deleteIS4_EESt6vectorIS7_SaIS7_EEEESD_RSA_IN4llvm6object12OwningBinaryINSF_10ObjectFileEEESaISI_EERNS_16progress_counterE+0x161): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
lib/libmull.a(MutantExecutionTask.cpp.o): In function `mull::MutantExecutionTask::operator()(__gnu_cxx::__normal_iterator<mull::MutationPoint* const*, std::vector<mull::MutationPoint*, std::allocator<mull::MutationPoint*> > >, __gnu_cxx::__normal_iterator<mull::MutationPoint* const*, std::vector<mull::MutationPoint*, std::allocator<mull::MutationPoint*> > >, std::vector<std::unique_ptr<mull::MutationResult, std::default_delete<mull::MutationResult> >, std::allocator<std::unique_ptr<mull::MutationResult, std::default_delete<mull::MutationResult> > > >&, mull::progress_counter&)':
MutantExecutionTask.cpp:(.text._ZN4mull19MutantExecutionTaskclEN9__gnu_cxx17__normal_iteratorIPKPNS_13MutationPointESt6vectorIS4_SaIS4_EEEESA_RS7_ISt10unique_ptrINS_14MutationResultESt14default_deleteISC_EESaISF_EERNS_16progress_counterE+0x161): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
lib/libmull.a(OriginalCompilationTask.cpp.o): In function `mull::OriginalCompilationTask::operator()(__gnu_cxx::__normal_iterator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > const*, std::vector<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> >, std::allocator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > > > >, __gnu_cxx::__normal_iterator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > const*, std::vector<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> >, std::allocator<std::unique_ptr<mull::MullModule, std::default_delete<mull::MullModule> > > > >, std::vector<llvm::object::OwningBinary<llvm::object::ObjectFile>, std::allocator<llvm::object::OwningBinary<llvm::object::ObjectFile> > >&, mull::progress_counter&)':
OriginalCompilationTask.cpp:(.text._ZN4mull23OriginalCompilationTaskclEN9__gnu_cxx17__normal_iteratorIPKSt10unique_ptrINS_10MullModuleESt14default_deleteIS4_EESt6vectorIS7_SaIS7_EEEESD_RSA_IN4llvm6object12OwningBinaryINSF_10ObjectFileEEESaISI_EERNS_16progress_counterE+0x161): undefined reference to `llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
lib/libmull.a(InstrumentationResolver.cpp.o): In function `mull::InstrumentationResolver::findSymbol(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
InstrumentationResolver.cpp:(.text._ZN4mull23InstrumentationResolver10findSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0xa7): undefined reference to `llvm::RTDyldMemoryManager::getSymbolAddressInProcess(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
lib/libmull.a(NativeResolver.cpp.o): In function `mull::NativeResolver::findSymbol(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
NativeResolver.cpp:(.text._ZN4mull14NativeResolver10findSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x94): undefined reference to `llvm::RTDyldMemoryManager::getSymbolAddressInProcess(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Makefile:67: recipe for target 'ninja.build.unit-tests' failed
make: *** [ninja.build.unit-tests] Error 1
I played around with -D_GLIBCXX_USE_CXX11_ABI=0/1 to try and fix it but some part is always unlinkable. Is there a way to ensure the ABI is the same as used in building LLVM?