Compilation
O-MVLL relies on the following dependencies:
- LLVM (version depending on the toolchain version)
- CPython (3.10.7)
- spdlog (1.10.0)
- Pybind11 (2.10.0)
As a first step, let’s consider that we compiled all the dependencies. O-MVLL is a C++17 out-of-tree LLVM pass so we don’t need to compile LLVM for each build.
The CMake configuration step can be invoked as follows:
$ git clone https://github.com/open-obfuscator/o-mvll.git
$ mkdir o-mvll/src/build && cd o-mvll/src/build
On Linux
export NDK_STAGE1=${LLVM_ROOT}/out/stage1-install
export NDK_STAGE2=${LLVM_ROOT}/out/stage2
$ cmake -GNinja .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=${NDK_STAGE1}/bin/clang++ \
-DCMAKE_C_COMPILER=${NDK_STAGE1}/bin/clang \
-DCMAKE_CXX_FLAGS="-stdlib=libc++" \
-DPython3_ROOT_DIR=${PYTHON_ROOT} \
-DPython3_LIBRARY=${PYTHON_ROOT}/lib/libpython3.10.a \
-DPython3_INCLUDE_DIR=${PYTHON_ROOT}/include/python3.10 \
-Dpybind11_DIR=${PYBIND11_ROOT}/share/cmake/pybind11 \
-Dspdlog_DIR=${SPDLOG_ROOT}/lib/cmake/spdlog \
-DLLVM_DIR=${NDK_STAGE2}/lib64/cmake/llvm \
-DOMVLL_ABI=CustomAndroid
$ ninja
On macOS
The plugin can be built on macOS for both NDK and Xcode toolchains.
Prerequisite: Set the $LLVM_ROOT
environment variable to point to the LLVM
package corresponding to your target toolchain:
- NDK: Package ends with
NDK*-Darwin
- Xcode: Package ends with
git-{arch}-Darwin
.
Xcode
export XCODE_TOOLCHAIN="$(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain"
$ cmake -GNinja \
-S src \
-B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=${XCODE_TOOLCHAIN}/usr/bin/clang \
-DCMAKE_CXX_COMPILER=${XCODE_TOOLCHAIN}/usr/bin/clang++ \
-DCMAKE_OSX_DEPLOYMENT_TARGET="15.4" \
-DPython3_ROOT_DIR=${PYTHON_ROOT} \
-DPython3_LIBRARY=${PYTHON_ROOT}/lib/libpython3.10.a \
-DPython3_INCLUDE_DIR=${PYTHON_ROOT}/include/python3.10 \
-Dpybind11_DIR=${PYBIND11_ROOT}/share/cmake/pybind11 \
-Dspdlog_DIR=${SPDLOG_ROOT}/lib/cmake/spdlog \
-DLLVM_DIR=${LLVM_ROOT}/lib/cmake/llvm \
-DPYBIND11_NOPYTHON=1 \
-DOMVLL_ABI=Apple
$ ninja -C build
NDK
android/ndk/releases
.export NDK_COMPILER="/path/to/toolchains/llvm/prebuilt/darwin"
$ cmake -GNinja \
-S src \
-B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=${NDK_COMPILER}/bin/clang \
-DCMAKE_CXX_COMPILER=${NDK_COMPILER}/bin/clang++ \
-DCMAKE_OSX_DEPLOYMENT_TARGET="15.4" \
-DPython3_ROOT_DIR=${PYTHON_ROOT} \
-DPython3_LIBRARY=${PYTHON_ROOT}/lib/libpython3.10.a \
-DPython3_INCLUDE_DIR=${PYTHON_ROOT}/include/python3.10 \
-Dpybind11_DIR=${PYBIND11_ROOT}/share/cmake/pybind11 \
-Dspdlog_DIR=${SPDLOG_ROOT}/lib/cmake/spdlog \
-DLLVM_DIR=${LLVM_ROOT}/lib/cmake/llvm \
-DPYBIND11_NOPYTHON=1 \
-DOMVLL_ABI=Android
$ ninja -C build
You can download the dependencies at the following links.
NDK on Linux
openobfuscator/omvll-ndk
.Version | URL |
---|---|
r25c | https://open-obfuscator.build38.io/static/omvll-deps-ndk-r25c.tar |
r26d | https://open-obfuscator.build38.io/static/omvll-deps-ndk-r26d.tar |
NDK on macOS
Version | URL |
---|---|
r26d | https://open-obfuscator.build38.io/static/omvll-v1.4.0-macos-deps.tar |
Xcode
arm64
& x86-64
from an Apple M1.Compilation Time
Generate NDK deps
O-MVLL dependencies can be generated easily using the same repository:
# Make sure you have expected ANDROID_HOME variable is already satisfied
ANDROID_HOME="sdk folder installation"
# Install ndk version used by the project
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'ndk;25.2.9519653'
git clone https://github.com/open-obfuscator/o-mvll.git o-mvll && cd o-mvll
./scripts/deps/generate_deps.sh -p ndk -o output.tar.gz
# output.tar.gz will be generated with all the required dependencies.
Generate XCode deps
Manually generating the LLVM deps for Xcode is no longer supported. Please consider using the prebuilt dependencies instead.
Docker Build
To ease the compilation of O-MVLL, we provide Docker images with the correct environment to compile O-MVLL for both Android NDK and the Xcode toolchain.
Android NDK
$ docker pull openobfuscator/omvll-ndk
$ git clone https://github.com/open-obfuscator/o-mvll
$ curl -LO https://open-obfuscator.build38.io/static/omvll-deps-ndk-r26d.tar
$ mkdir -p ./third-party
$ tar xvf omvll-deps-ndk-r26d.tar -C ./third-party
$ docker run --rm \
-v $(pwd)/o-mvll:/o-mvll \
-v $(pwd)/third-party:/third-party \
openobfuscator/omvll-ndk sh /o-mvll/scripts/docker/ndk_r26d_compile.sh
Xcode
$ docker pull openobfuscator/omvll-xcode
$ git clone https://github.com/open-obfuscator/o-mvll
$ curl -LO https://open-obfuscator.build38.io/static/omvll-v1.4.0-macos-deps.tar
$ mkdir -p ./third-party
$ tar xvf omvll-v1.4.0-macos-deps.tar -C ./third-party
$ docker run --rm \
-v $(pwd)/o-mvll:/o-mvll \
-v $(pwd)/third-party:/third-party \
openobfuscator/omvll-xcode sh /o-mvll/scripts/docker/xcode_16_compile.sh