我想在带有llvm工具链(libc ++,libunwind,compiler-rt,clang ...)的代码存储库上使用c ++内存清理器(msan)。因此,我需要做的第一件事就是构建msan仪器化的libc ++。
从MemorySanitizerLibcxxHowTo,我需要使用选项-DLLVM_USE_SANITIZER=Memory
或-DLLVM_USE_SANITIZER=MemoryWithOrigin
构建libc ++。
在LLVM’s compiler runtime library
部分的assembling a complete llvm toolchain中
如果使用libc ++和/或libc ++ abi,则可能需要通过传递-DLIBCXX_USE_COMPILER_RT = YES和/或-DLIBCXXABI_USE_COMPILER_RT = YES来配置它们以使用编译器-rt而不是libgcc_s。否则,您可能最终会将两个运行时库链接到程序中(这通常是无害的,但很浪费)。
由于我的目标是完整的llvm工具链,因此我认为我应该添加-DLIBCXX_USE_COMPILER_RT=YES
和-DLIBCXXABI_USE_COMPILER_RT=YES
所以我使用下面的脚本下载libcxx和libcxxabi并创建预期的目录布局并运行构建。
#!/bin/bash
file_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
num_of_processors=$(cat /proc/cpuinfo | grep -c ^processor)
cd $file_dir
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
(cd llvm/projects && svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx)
(cd llvm/projects && svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi)
export CC=clang
export CXX=clang++
[ -d build ] && rm -rf build
mkdir -p build && cd build
cmake ../llvm -DCMAKE_INSTALL_PREFIX=.. \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_USE_SANITIZER=Memory \
-DLIBCXX_USE_COMPILER_RT=YES \
-DLIBCXXABI_USE_COMPILER_RT=YES
make install-libcxx install-libcxxabi -j$num_of_processors
我得到的错误是:
-- Performing Test LIBCXX_SUPPORTS_STD_COLON_CXX11_FLAG - Failed
CMake Error at projects/libcxx/CMakeLists.txt:538 (message):
C++11 or greater is required but the compiler does not support c++11
-- Configuring incomplete, errors occurred!
See also "~/libcxx-
msan/build/CMakeFiles/CMakeOutput.log".
See also "~/libcxx-
msan/build/CMakeFiles/CMakeError.log".
仅当-DLLVM_USE_SANITIZER=Memory
和-DLIBCXX_USE_COMPILER_RT=YES
同时存在时才会发生此错误。删除它们中的任何一个都可以解决此问题。
有什么办法可以解决问题并保留两个选项(msan和编译器rt)?预先感谢!