1

我想在带有 llvm 工具链(libc++、libunwind、compiler-rt、clang ...)的代码仓库上使用 c++ memory sanitizer(msa​​n)。所以我需要做的第一件事是构建msan-instrumented libc++。

MemorySanitizerLibcxxHowTo 开始,我需要使用选项-DLLVM_USE_SANITIZER=Memory-DLLVM_USE_SANITIZER=MemoryWithOrigin.

组装一个完整的 llvm 工具链,在LLVM’s compiler runtime library部分

如果使用 libc++ 和/或 libc++abi,您可能需要通过将 -DLIBCXX_USE_COMPILER_RT=YES 和/或 -DLIBCXXABI_USE_COMPILER_RT=YES 传递给 cmake,将它们配置为使用 compiler-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)?提前致谢!

4

0 回答 0