ollvm编译笔记

转载:https://blog.csdn.net/u011337769/article/details/86659566

1.下载llvm4.0

2.安装ndk,版本信息为 

添加环境变量 

export NDK_HOME=/opt/android/ndk/android-ndk-r10b

export PATH=$NDK_HOME:$PATH

 3.准备编译ollvm的环境

安装编译工具

apt-get install cmake

apt-get install g++

 

编译ollvm源码

git clone -b obfuscator-llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git

mkdir build

cd build

cmake -DCMAKE_BUILD_TYPE:String=Release ../

make -j7

在build目录下会生成编译后的程序,我们只会用到bin和lib目录下的文件

 

 执行cmake时报错

 

 修改为以下命令再尝试编译可顺利通过

cmake  -DCMAKE_BUILD_TYPE=Release  -DLLVM_INCLUDE_TESTS=OFF  ../

 

然后执行make  –j7,编译报错,可能是虚拟机配置低了,库与库之间存在依赖导致报错,将配置改为4核4G内存,再次make 不加-j参数,编译通过, 

 

 

4.将编译好的工具链整合到NDK中

将ndk中的toolchains下的llvm/prebuilt复制到toolchains/o-llvm-4.0中

 

 将编译好的ollvm4.0的bin和lib复制替换到ndk/toolchains/ollvm-4.0/下的bin和lib

 

 

 在android-ndk-r14b/build/core/toolchains目录下,新建目录 arm-linux-androideabi-clang-ollvm4.0,拷贝目录 arm-linux-androideabi-clang 下的文件 config.mk 与 setup.mk 到 arm-linux-androideabi-clang-ollvm4.0 中,修改setup.mk文件。

 

 

 

#change before

#LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,llvm)

#LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

#change after

OLLVM_NAME := ollvm-4.0

LLVM_TOOLCHAIN_PREBUILT_ROOT := $(call get-toolchain-root,$(OLLVM_NAME))

LLVM_TOOLCHAIN_PREFIX := $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/

 使用 ollvm 进行 ndk 的编译需要对 Application.mk 和 Android.mk 文件做相应的修改。Android.mk 中添加混淆编译参数:

 

LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

 Application.mk 中配置 NDK_TOOLCHAIN_VERSION

 

APP_ABI := x86 armeabi-v7a x86_64 arm64-v8a armeabi mips64

  NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0

 

5.使用ollvm生成混淆过的程序

命令介绍

-mllvm -fla 开启控制流平坦化

-mllvm -sub 开启指令替换

-mllvm -bcf 开启虚假控制流

-mllvm -sobf 开启字符串混淆

-mllvm -seed=0xdeadbeaf 指定随机数种子生成器

bcf可以配合下面参数使用

-mllvm -bcf_loop=3 设置函数混淆次数为3次 不加此选项默认为1次

-mllvm -bcf_prob=40 设置代码块被混淆的概率是40%,默认30%

 创建工程目录 此处为test,创建子目录jni,在jni目录下创建Android.mk并根据需求编写mk文件

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test

LOCAL_SRC_FILES := test.c

LOCAL_CFLAGS += -mllvm -sub -mllvm -bcf -mllvm -fla

LOCAL_ARM_MODE := arm

include $(BUILD_EXECUTABLE)

在jni目录下创建Application.mk并根据需求编写mk文件 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

APP_PLATFORM :=android-14

APP_ABI := armeabi-v7a

NDK_TOOLCHAIN_VERSION := clang-ollvm-4.0

include $(BUILD_EXECUTABLE)

 在jni目录下创建代码文件hello.c

 

#include <stdio.h>

int main(int argc, char** argv)

{

         int a=1;

         int b=0;

         if(a>b)

         {

                   printf("a:%d\n",a);

         }

         else{

                   printf("b:%d\n",b);

         }

         return 0;          

}

 在工程目录下执行ndk-build命令

 

 混淆后的效果:

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN是中国最大的IT技术社区,编译原理是计算机科学中的重要课程之一。关于CSDN上编译原理的笔记,我可以从以下几个方面进行回答。 首先,CSDN上编译原理的笔记文档丰富多样,涵盖了编译原理的各个方面,包括词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。这些笔记以通俗易懂的语言编写,让初学者也能够轻松理解编译原理的基本原理和实现方式。同时,笔记中还提供了大量的示例代码和实践案例,帮助读者更好地理解和应用编译原理的知识。 其次,CSDN上编译原理的笔记内容全面,既包括理论知识,也包括实践经验。对于理论知识,笔记中详细介绍了编译器的工作原理、各个阶段的算法和数据结构等内容,以及常用的编译器设计模式和优化方法。对于实践经验,笔记中分享了一些常见的编译器实现技巧,如错误处理、符号表管理、代码生成等。这些内容对于编译原理的学习和实践非常有帮助。 最后,CSDN上编译原理的笔记具有互动性和实时性。读者可以通过评论、提问等方式与笔记作者进行交流和讨论,解决自己在学习编译原理过程中遇到的问题。同时,笔记作者也会定期更新和修正笔记内容,确保笔记始终保持最新、最正确的信息。 综上所述,CSDN上编译原理的笔记提供了丰富多样的内容,既有理论知识,又有实践经验,对于学习和理解编译原理非常有帮助。读者可以通过阅读这些笔记,深入学习编译原理的基本原理和实现方式,并应用到实际项目中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值