Installation and Integration ============================ SDK --- For each platform supported by LIEF there is an SDK that contains: * Static library * Headers * Examples Nightly build can be downloaded on: https://lief.s3-website.fr-par.scw.cloud/latest/sdk while releases are available on Github release page: https://github.com/lief-project/LIEF/releases. Python ------ .. _v12-label: Since 0.12.0 ************ Since LIEF v0.12.0 the Python nightly wheels have moved to Scalway S3. They can be installed through: .. code-block:: console $ pip install [--user] --index-url https://lief.s3-website.fr-par.scw.cloud/latest lief .. _v10-label: Since 0.10.0 ************ To install nightly build (master): .. code-block:: console $ pip install [--user] --index-url https://lief-project.github.io/packages lief You can also directly download the Python wheel package on: https://lief-project.github.io/packages/lief .. note:: If you already installed a nightly version of LIEF you may need the flag: ``--no-cache-dir`` To install **release** package .. code-block:: console $ pip install lief Release packages can be found on `PyPI `_ and the Github release page: https://github.com/lief-project/LIEF/releases Using ``setup.py``, one can build and install lief as follows: .. code-block:: console $ python ./setup.py [--user] install LIEF modules can also be parameterized using the following options: .. code-block:: console $ python ./setup.py --help ... --lief-test Build and make tests --ninja Use Ninja as build system --sdk Build SDK package --lief-no-json Disable JSON module --lief-no-logging Disable logging module --lief-no-elf Disable ELF module --lief-no-pe Disable PE module --lief-no-macho Disable Mach-O module --lief-no-android Disable Android formats --lief-no-art Disable ART module --lief-no-vdex Disable VDEX module --lief-no-oat Disable OAT module --lief-no-dex Disable DEX module From 0.8.0 to 0.9.0 ******************* To install **release** package .. code-block:: console $ pip install pylief-VERSION.zip Release packages can be found here: `Releases `_ Before 0.8.0 ************ To install the Python API (example with ``Python 3.5``): .. code-block:: console $ pip install lief-XX.YY.ZZ_py35.tar.gz Visual Studio Integration ------------------------- The pre-built SDK is compiled in release configuration with the *Multi-threaded* runtime library. As example we compile the following snippet with Visual Studio 2015 .. code-block:: cpp #include "stdafx.h" #include int main() { std::unique_ptr pe_binary = LIEF::PE::Parser::parse("C:\\Windows\\explorer.exe"); std::cout << *pe_binary << std::endl; return 0; } First the build type must be set to ``Release``: .. figure:: _static/windows_sdk/s1.png :align: center Build type set to ``Release`` Then we need to specify the location of the LIEF include directory: .. figure:: _static/windows_sdk/s2.png :align: center LIEF include directory and the location of the ``LIEF.lib`` library: .. figure:: _static/windows_sdk/s5.png :align: center LIEF library As ``LIEF.lib`` was compiled with the ``\MT`` flag we have to set it: .. figure:: _static/windows_sdk/s3.png :align: center *Multi-threaded* as runtime library LIEF makes use of ``and, or, not`` C++ keywords. As **MSVC** doesn't support these keywords by default, we need to add the special file ``iso646.h``: .. figure:: _static/windows_sdk/s4.png :align: center Add ``iso646.h`` file XCode Integration ----------------- To integrate LIEF within a XCode project, one needs to follow these steps: First we create a new project: .. figure:: _static/xcode_integration/step1.png :align: center New Project For this example we select a *Command Line Tool*: .. figure:: _static/xcode_integration/step2.png :align: center Command Line Tool .. figure:: _static/xcode_integration/step3.png :align: center Project options Then we need to add the static library ``libLIEF.a`` or the shared one (``libLIEF.dylib``) .. figure:: _static/xcode_integration/step4.png :align: center Project configuration - Build Phases .. figure:: _static/xcode_integration/step5.png :align: center Project configuration - Build Phases .. figure:: _static/xcode_integration/step6.png :align: center Project configuration - Build Phases In the `Build Settings - Search Paths` one needs to specify the paths to the **include directory** and to location of the LIEF libraries (``libLIEF.a`` and/or ``libLIEF.dylib``) .. figure:: _static/xcode_integration/step7.png :align: center Libraries and Include search paths Once the new project configured we can use LIEF: .. figure:: _static/xcode_integration/code.png :align: center Source code and run it: .. figure:: _static/xcode_integration/result.png :align: center Output CMake Integration ----------------- There are a few ways to integrate LIEF as a dependency in another project. The different methods are listed in order of preference and CMake best practice. These listings are only to show basic examples. Please refer to the CMake documentation for questions related to more complex project setup. find_package() ************** Using `CMake find_package() `_: .. literalinclude:: ../../examples/cmake/find_package/CMakeLists.txt :language: cmake :lines: 5-12 And now, to be integrated within a project: .. literalinclude:: ../../examples/cmake/find_package/CMakeLists.txt :language: cmake :lines: 13- For the compilation: .. include:: ../../examples/cmake/find_package/README.rst :start-line: 3 A *full* example is available in the ``examples/cmake/find_package`` directory. add_subdirectory() or FetchContent ********************************** First, set up the options you want to set as default for the LIEF project: .. literalinclude:: ../../examples/cmake/add_subdirectory/CMakeLists.txt :language: cmake :lines: 7-19 Using `CMake add_subdirectory() `_ to add a submodule LIEF source directory: .. literalinclude:: ../../examples/cmake/add_subdirectory/CMakeLists.txt :language: cmake :lines: 21-28 If we are using a CMake version greater than or equal to 3.11, we can use `CMake FetchContent module `_ to download or specify a LIEF source directory outside of the current directory: .. literalinclude:: ../../examples/cmake/add_subdirectory/CMakeLists.txt :language: cmake :lines: 33-61 And now, to be integrated within a project: .. literalinclude:: ../../examples/cmake/add_subdirectory/CMakeLists.txt :language: cmake :lines: 65- For the compilation: .. include:: ../../examples/cmake/add_subdirectory/README.rst :start-line: 3 A *full* example is available in the ``examples/cmake/add_subdirectory`` directory. External Project **************** If you don't want to use LIEF as a submodule or upgrade to CMake 3.11, we can use `CMake External Project `_ to set up a project as a `*superbuild* `_: .. literalinclude:: ../../examples/cmake/external_project/CMakeLists.txt :language: cmake :lines: 1-41 And now, to be integrated with our main ``HelloLIEF`` project that is located in a subdirectory and looks exactly like the ``find_package()`` example shown earlier: .. literalinclude:: ../../examples/cmake/external_project/CMakeLists.txt :language: cmake :lines: 44- For the compilation: .. include:: ../../examples/cmake/external_project/README.rst :start-line: 3 A *full* example is available in the ``examples/cmake/external_project`` directory.