| ``` | |
| Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved. | |
| DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| The Universal Permissive License (UPL), Version 1.0 | |
| Subject to the condition set forth below, permission is hereby granted to | |
| any person obtaining a copy of this software, associated documentation | |
| and/or data (collectively the "Software"), free of charge and under any | |
| and all copyright rights in the Software, and any and all patent rights | |
| owned or freely licensable by each licensor hereunder covering either (i) | |
| the unmodified Software as contributed to or provided by such licensor, | |
| or (ii) the Larger Works (as defined below), to deal in both | |
| (a) the Software, and | |
| (b) any piece of software and/or hardware listed in the lrgrwrks.txt file | |
| if one is included with the Software (each a "Larger Work" to which the | |
| Software is contributed by such licensors), | |
| without restriction, including without limitation the rights to copy, | |
| create derivative works of, display, perform, and distribute the Software | |
| and make, use, sell, offer for sale, import, export, have made, and have | |
| sold the Software and the Larger Work(s), and to sublicense the foregoing | |
| rights on either these or other terms. | |
| This license is subject to the following condition: | |
| The above copyright notice and either this complete permission notice or | |
| at a minimum a reference to the UPL must be included in all copies or | |
| substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
| NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
| OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
| USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| or visit www.oracle.com if you need additional information or have any | |
| questions. | |
| ``` | |
| --- | |
| # hsdis - a HotSpot plugin for disassembling dynamically generated code | |
| The files in this directory are built independently of the HotSpot JVM. | |
| hsdis is an interface exposed by Hotspot. There are several backends that | |
| implement this interface, using different disassembly engines. Included in the | |
| JDK is support for building hsdis with Capstone, LLVM or GNU binutils. The | |
| interface is fairly straightforward and easy to implement using other backends. | |
| ## Building and installing | |
| To compile hsdis, you need to activate hsdis support, and select the proper | |
| backend to use. This is done with the configure switch `--with-hsdis=<backend>`, | |
| where `<backend>` is either `capstone`, `llvm` or `binutils`. For details, see | |
| the sections on the respective backends below. | |
| To build the hsdis library, run `make build-hsdis`. This will build the library | |
| in a separate directory, but not make it available to the JDK in the | |
| configuration. To actually install it in the JDK, run `make install-hsdis`. | |
| **NOTE:** If you do this using the binutils backend, the resulting build may not | |
| be distributable. Please get legal advice if you intend to distribute the result | |
| of your build. | |
| ## Using the library | |
| The hsdis library will be automatically loaded by Hotspot when you use the | |
| diagnostic option `-XX:+PrintAssembly`. Note that since this is a diagnostic | |
| option, you need to unlock these first, so in practice you activate it using | |
| `-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly`. | |
| If using the LLVM backend on Windows, you need to be sure that the LLVM DLL file | |
| (or files) can be found by hsdis. In practice, this means that you either need | |
| to copy `LLVM-C.DLL` to a place on your `PATH` or the JDK `bin` directory, or | |
| you need to augment your `PATH` variable to also point to where you installed | |
| LLVM (like `C:\LLVM\bin`). | |
| More information is available at the [HotSpot | |
| wiki](https://wiki.openjdk.org/display/HotSpot/PrintAssembly). | |
| ## Building with Capstone | |
| To build this project using Capstone you need to have Capstone installed. | |
| Typical ways of installation can be `sudo apt install libcapstone-dev` (on | |
| Debian and derivatives), or `brew install capstone` (on macOS with Homebrew). | |
| For Windows, you need to download the "Core Engine", and unzip it. See the | |
| [Capstone Download | |
| page](https://www.capstone-engine.org/download.html#windows---core-engine-) for | |
| up-to-date download links. | |
| This has been tested with Capstone v4.0.2, but earlier (and later) versions are | |
| also likely to work. | |
| To build hsdis using Capstone, you must enable it in configure by `bash | |
| configure --with-hsdis=capstone`. | |
| On Linux and macOS, the location Capstone can most often be auto-detected. If | |
| this fails, or if you are building on Windows, you need to specify where | |
| Capstone is located using `--with-capstone=<path>`. This path should point to | |
| where you have extracted the Core Engine zip file. | |
| ## Building with LLVM | |
| To build this project using LLVM you need to have LLVM installed. Typical ways | |
| of installation can be `sudo apt install llvm` (on Debian and derivatives), or | |
| `brew install llvm` (on macOS with Homebrew). For Windows, see below. | |
| This has been tested with LLVM v13.0.0, but earlier (and later) versions are | |
| also likely to work. | |
| To build hsdis using LLVM, you must enable it in configure by `bash configure | |
| --with-hsdis=llvm`. | |
| If `llvm-config` is not in your path, you will need to specify the LLVM home using | |
| `--with-llvm=<LLVM home>`. Example: If your `llvm-config` is in `~/my-llvm/bin`, | |
| then you should use `--with-llvm=~/my-llvm`. | |
| ### Building with LLVM on Windows | |
| Getting a usable installation on Windows is trickier than on the other | |
| platforms. You can download (and patch) the official distribution, or you can | |
| build it yourself. | |
| Links to the latest version of the official build is available at [LLVMs | |
| download page](https://releases.llvm.org/download.html). Download the file | |
| *LLVM-nn.n.n-win64.exe*, and run it to let it install itself. The default | |
| installation location is `C:\Program Files\LLVM`. This is not ideal due to the | |
| spaces in the path, so it is recommended to put it elsewhere (e.g. `C:\LLVM`). | |
| For very unclear reasons, the official Windows build is missing almost all LLVM | |
| include files. (At least this was the case up to and including LLVM 13.) You | |
| will need to complement your installation with the proper include files. One way | |
| to do this is to install LLVM in Cygwin. This will give you (apart from the Cygwin-based dll | |
| files which are unusable with Visual Studio) a complete set of the | |
| headers. These are located in `/usr/include/llvm` and `/usr/include/llvm-c`. Copy | |
| these directories, with all their content, into `$LLVM_HOME/include`. | |
| Alternatively, you can build LLVM yourself from source. This process is | |
| documented at the [LLVM Visual Studio | |
| page](https://llvm.org/docs/GettingStartedVS.html). | |
| Either which way, you must tell configure the location of your LLVM installation | |
| using `--with-llvm=<path to LLVM home>`. | |
| The `llvm-config` tool, which configure uses on other platforms to get the | |
| proper compile and link flags to use, is unfortunately not usable on Windows. In | |
| the official distribution, it is just missing. And the self-built version tend | |
| to give broken and unusable output. Therefore configure uses heuristics to setup | |
| proper flags to the compiler and linker. This was verified to work for LLVM v13, | |
| but might be incorrect for other versions. Manual override of `HSDIS_CFLAGS`, | |
| `HSDIS_LDFLAGS` and/or `HSDIS_LIBS` on the make command line might be needed in | |
| that case. | |
| ## Building with binutils | |
| To build this project using binutils you need a copy of GNU binutils to build | |
| against. It is known to work with binutils 2.37. Building against versions older | |
| than 2.29 is not supported. Download a copy of the software from [FSF binutils | |
| page](http://directory.fsf.org/project/binutils) or one of its mirrors. | |
| To build this library, you must enable building in configure by `bash configure | |
| --with-hsdis=binutils`. | |
| You must also specify where binutils is located. To facilitate building, you can | |
| point to a place where the (unpacked) binutils sources are located using | |
| `--with-binutils-src=<location>`, and configure will build binutils for you. On | |
| repeated runs, you can keep this command line option, since configure will | |
| figure out that the binutils binaries are already present and skip building, or | |
| you can replace it with `--with-binutils=<location>`. | |
| If you have pre-built binutils binaries, you can point to them directly using | |
| `--with-binutils=<location>`. | |
| If you want to build hsdis with binutils provided by system (e.g. binutils-devel | |
| from Fedora, binutils-dev from Ubuntu), you can pass `--with-binutils=system`. | |
| `system` is available on Linux only. | |
| ### Building with binutils on Windows | |
| On Windows, the normal Microsoft Visual Studio toolchain cannot build binutils. | |
| Instead we need to use the mingw compiler. This is available as a cygwin | |
| package. You need to install the `gcc-core` and `mingw64-x86_64-gcc-core` | |
| packages (or `mingw64-i686-gcc-core`, if you want the 32-bit version) and | |
| `mingw64-x86_64-glib2.0`. |