ollvm编译中遇到的问题

ollvm的作用是对c/c++代码进行混淆。
本文主要记录ollvm的编译步骤以及遇到的编译问题的解决。

根据该项目的官方wiki https://github.com/obfuscator-llvm/obfuscator/wiki/Installation

ollvm的编译大致步骤如下:

  1. checkout 最新的分支
    git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
  2. 创建一个目录专门用于保存编译的中间文件和最终的目标文件
    mkdir build
  3. cd build
  4. 对cmake 项目生成makefile
    cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
  5. make -j7

遇到的问题:

  1. 首先在第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

  1. 编译 obfuscator/tools/clang/lib/CodeGen/CGOpenMPRuntime.cpp时出错,提示:

lambda parameter ‘CGF’ previously declared as a capture
解决办法:
找到错误提示的那几行,分别修改如下(即将&CGF删掉):


image.png
  1. 编译 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) {

另外

  1. 在前期可以make -j参数调用多进程加速编译。当你遇到问题时, 建议将 -j参数去掉。避免干扰
  2. 可以使用 make VERBOSE=1来打印编译中使用的具体gcc/g++的编译参数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。