在 Ubuntu 18.04 下安装 Klee 2.2

Klee 是基于 LLVM 的符号执行引擎,因此安装 Klee 首先需要安装对应版本的 LLVM 。Klee 2.2 版本是基于 LLVM 9 的,本文主要记录在纯净 Ubuntu 18.04 安装 Klee 2.2 的过程。
注:以下所有过程均在本人 Ubuntu 的目录 /home/nino/klee_env 中进行。

  • 安装依赖
$ sudo apt-get install build-essential curl libcap-dev git cmake libncurses5-dev python-minimal python-pip unzip libtcmalloc-minimal4 libgoogle-perftools-dev libsqlite3-dev doxygen
$ sudo apt-get install python3 python3-pip gcc-multilib g++-multilib
$ pip3 install lit tabulate wllvm
$ sudo apt-get install zlib1g-dev
  • 安装 LLVM 9
# 对于版本在18.04以上的Ubuntu,可以直接使用包管理器安装LLVM套件
$ sudo apt-get install clang-9 llvm-9 llvm-9-dev llvm-9-tools
  • 安装约束求解器 Z3
    首先访问 Z3 的发布版网站下载 4.7.1 版本的源代码压缩包,将压缩包放入到目录 /home/nino/klee_env 中。然后执行如下命令从源代码构建 Z3 Solver:
$ unzip z3-z3-4.7.1.zip
$ cd z3-z3-4.7.1/
$ mkdir build
$ cd build/
$ cmake -G "Unix Makefiles" ../
$ make -j2 #根据处理器的核心数替换数字2
$ sudo make install
  • 获取谷歌测试集(可选)
    Klee 使用谷歌测试集作为单元测试库,这是一个可选项,如果需要进行单元测试则可以通过下述命令下载谷歌测试集,并且在用 CMake 配置 Klee 的时候输入 CMake 命令行参数 -DENABLE_UNIT_TESTS=ON-DGTEST_SRC_DIR=<GTEST_SOURCE_DIR>
$ curl -OL https://github.com/google/googletest/archive/release-1.7.0.zip
$ unzip release-1.7.0.zip
  • 构建 uClibc 和 POSIX 环境模型(可选)
    默认来说,Klee 仅仅对不使用任何外部代码的程序(如 C 库函数)进行分析。如果需要使用 Klee 来运行实际的程序,则需要启用构建在 uClibc C库之上的 KLEE POSIX 运行环境。
$ git clone https://github.com/klee/klee-uclibc.git  
$ cd klee-uclibc
$ gedit ./configure
# 修改configure中的第354行代码,将其中getAbsPathForToolInPathEnv函数的实参llvm-config修改为llvm-config-9。
$ ./configure --make-llvm-lib  
$ make -j2
  • 下载 Klee2.2 源代码压缩包
    进入 Klee 的 Release 网站 ,下载 Klee2.2 的压缩包,并且解压缩。此时在文件夹 /home/nino/klee_env 下的文件夹如下:
    在这里插入图片描述
  • 构建 libc++(可选)
    为了支持C++代码的运行,需要打开对C++标准库的支持。
$ cd klee-2.2
$ LLVM_VERSION=9 SANITIZER_BUILD= BASE=/home/nino/klee_env REQUIRES_RTTI=1 DISABLE_ASSERTIONS=1 ENABLE_DEBUG=0 ENABLE_OPTIMIZED=1 ./scripts/build/build.sh libcxx
  • 构建编译 Klee 2.2
#如果是将上述可选项都加入了,则可以直接复制一下cmake的参数,否则需要自己调整删减掉不需要的参数
$ cd klee-2.2
$ mkdir build
$ cd build
$ cmake	\
-DENABLE_SOLVER_Z3=ON	\
-DENABLE_POSIX_RUNTIME=ON	\
-DENABLE_KLEE_UCLIBC=ON	\
-DKLEE_UCLIBC_PATH=/home/nino/klee_env/klee-uclibc	\
-DENABLE_UNIT_TESTS=ON	\
-DGTEST_SRC_DIR=/home/nino/klee_env/googletest-release-1.7.0	\
-DLLVM_CONFIG_BINARY=/usr/bin/llvm-config-9	\
-DLLVMCC=/usr/bin/clang-9	\
-DLLVMCXX=/usr/bin/clang++-9	\
-DENABLE_KLEE_LIBCXX=ON	\
-DKLEE_LIBCXX_DIR=/home/nino/klee_env/libc++-install-90	\
-DKLEE_LIBCXX_INCLUDE_DIR=/home/nino/klee_env/libc++-install-90/include/c++/v1	\
-DENABLE_KLEE_EH_CXX=ON	\
-DKLEE_LIBCXXABI_SRC_DIR=/home/nino/klee_env/llvm-90/libcxxabi	\
../
$ make -j2
  • 编译成功的二进制目录
    在这里插入图片描述
  • 测试
    在构建目录build下输入如下指令,输出如下运行过程:
# 运行系统测试和单元测试
$ make check

在这里插入图片描述在这里插入图片描述
至此,Klee 构建成功,以上构建 Klee 步骤均可在 CLion 中实现。

猜你喜欢

转载自blog.csdn.net/qq_21746331/article/details/114967920