This documentation explains how to build & install Keystone on all kind of nix OS. For Windows, see [COMPILE-WINDOWS.md](COMPILE-WINDOWS.md) 1. Dependency CMake is required to build keystone. - On Mac OS X, you can install "cmake" with "brew". $ brew install cmake - On Ubuntu Linux, install "cmake" with: $ sudo apt-get install cmake 2. From the root directory of Keystone source, compile its dynamic library with the following commands. $ mkdir build $ cd build $ ../make-share.sh In the case you want to compile with all the debug information, replace the last line with: $ ../make-share.sh debug For Linux distributions following the "Filesystem Hierarchy Standard" and put x64 libraries under $PREFIX/lib64, such as Fedora, Redhat & Suse, add "lib64" option at the end of make-share.sh script, like below. $ ../make-share.sh lib64 By default, this builds all architectures, which is: AArch64, ARM, Hexagon, Mips, PowerPC, Sparc, SystemZ & X86. To compile just some selected ones, pass a semicolon-separated list of targets to LLVM_TARGETS_TO_BUILD, like follows if we only want AArch64 & X86. $ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DLLVM_TARGETS_TO_BUILD="AArch64;X86" -G "Unix Makefiles" .. $ make -j8 You can also compile static a library with: $ mkdir build $ cd build $ ../make-lib.sh In the case you want to compile with all the debug information, replace the last line with: $ ../make-lib.sh debug For Linux distributions following the "Filesystem Hierarchy Standard" and put x64 libraries under $PREFIX/lib64, such as Fedora, Redhat & Suse, add "lib64" option at the end of make-share.sh script, like below. $ ../make-lib.sh lib64 Like above, this builds all architectures. To compile just some selected ones, pass a semicolon-separated list of targets to LLVM_TARGETS_TO_BUILD, like follows if we only want AArch64 & X86. $ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DLLVM_TARGETS_TO_BUILD="AArch64, X86" -G "Unix Makefiles" .. $ make -j8 To customize your build by specifying PREFIX or other installation directories, pass one of the variables at https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html to cmake. For example: $ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DLLVM_TARGETS_TO_BUILD="AArch64, X86" -G "Unix Makefiles" .. $ make -j8 3. Right after building, install Keystone. $ sudo make install Keystone is installed in `/usr/local`, depending on your distribution (eg. Ubuntu) you might need to add `/usr/local/lib` to `/etc/ld.so.conf`. Then update the dynamic linker with: $ sudo ldconfig Besides the libraries & C header files under directory "include/keystone", this step also installs a tool named "kstool" on the system. (The source of "kstool" is in the directory "kstool/kstool") 4. Test Keystone with "kstool" like below. $ kstool x32 "add eax, ebx" Run "kstool" without any option to find out how to use this handy tool. 5. Learn more on how to code your own tools with our samples. For C sample code, see code in directory samples/ For Python sample code, see code in directory bindings/python/