mac ollvm 和 ndk 集成

前言

经过上篇文章mac ollvm环境编译已经把ollvm编译好了,现在将ollvm集成到ndk中。

这里的ollvm是说的goron:https://github.com/amimo/goron

步骤

将ollvm中的clang, clang++, clang-format三个文件复制到ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/bin中,使用替换方式。

这里看一下ollvm编译完的结构:

复制到ndk那边目录结构:

测试

创建工程

随便创建一个ndk项目,就像这样。

配置NDK

app\build.gradle中增加下面配置:

android {
    // ......
    // 声明使用NDK的版本
    ndkVersion "21.1.6352462"

    // ......
}

编译APK

出现下面错误

/sysroot/usr/include/jni.h:27:10: fatal error: 'stdarg.h' file not found

复制头文件

上面的提示缺少stdarg.h文件,此文件在ollvm编译的文件夹lib/clang/9.0.0/include/中可以找到,然后复制到/ndk/21.1.6352462/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include的目录下。

以此类推的复制头文件,我这里一共复制了下面这些文件:

stdarg.h
stddef.h
__stddef_max_align_t.h
float.h

构建成功

开启混淆

上面的构建是一个常规的c++项目,并没有开启ollvm的混淆,把混淆开启一下,goron支持的配置如下:

说明 配置
间接跳转 -mllvm -irobf-indbr
间接函数调用 -mllvm -irobf-icall
间接全局变量引用 -mllvm -irobf-indgv
字符串(c string)加密功能 -mllvm -irobf-cse
过程相关控制流平坦混淆 -mllvm -irobf-cff
externalNativeBuild {
    cmake {
        cppFlags "-mllvm -irobf-indbr -mllvm -irobf-icall -mllvm -irobf-indgv -mllvm -irobf-cse"
    }
}

对比

因为mac上没有安装ida,我用Windows截图对比了一下:

源码

#include 
#include 

extern "C" JNIEXPORT jstring JNICALL
Java_com_sollyu_android_ollvmsimple_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

未混淆

开混淆

下载

知道你们懒,这是我编译好的goron,直接替换到你们的ndk就可以了,下载去吧:腾讯云

考虑时间的流逝,替换的时请注意您的ndk里的llvm的版本,我当前的版本:21.1.6352462

你可能感兴趣的:(mac ollvm 和 ndk 集成)