ollvm的作用是对c/c++代码进行混淆。
本文主要记录ollvm的编译步骤以及遇到的编译问题的解决。
根据该项目的官方wiki https://github.com/obfuscator-llvm/obfuscator/wiki/Installation
ollvm的编译大致步骤如下:
- checkout 最新的分支
git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git - 创建一个目录专门用于保存编译的中间文件和最终的目标文件
mkdir build - cd build
- 对cmake 项目生成makefile
cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/ - make -j7
遇到的问题:
- 首先在第4步生成makefile的时候就会出错
CMake Error at cmake/modules/AddLLVM.cmake:1163 (add_custom_target):
add_custom_target cannot create target "check-llvm-bindings-ocaml" because
another target with the same name already exists. The existing target is a
custom target created in source directory
很多人遇到这个问题,根据这个issue: https://github.com/obfuscator-llvm/obfuscator/issues/71
需要将cmake的命令行参数调整为:
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF ../obfuscator/
如果重新生成makefile还是遇到问题,则先在build目录rm -rf *,再重新cmake
- 编译 obfuscator/tools/clang/lib/CodeGen/CGOpenMPRuntime.cpp时出错,提示:
lambda parameter ‘CGF’ previously declared as a capture
解决办法:
找到错误提示的那几行,分别修改如下(即将&CGF删掉):
- 编译 tools/lli/lli.cpp 时报错
could not convert '((llvm::orc::remote::OrcRemoteTargetClient<ChannelT>*)this)->callB<llvm::orc::remote::OrcRemoteTargetRPCAPI::ReadMem>(Src, Size)'
from 'Expected<vector<unsigned char,allocator<unsigned char>>>'
to 'Expected<vector<char,allocator<char>>>'
return callB<ReadMem>(Src, Size);
找到出错的 include/llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h的那一行
修改前:
Expected<std::vector<char>> readMem(char *Dst, JITTargetAddress Src, uint64_t Size) {
修改后:
Expected<std::vector<uint8_t>> readMem(char *Dst, JITTargetAddress Src, uint64_t Size) {
另外
- 在前期可以make -j参数调用多进程加速编译。当你遇到问题时, 建议将 -j参数去掉。避免干扰
- 可以使用 make VERBOSE=1来打印编译中使用的具体gcc/g++的编译参数