| /* ********************************************************** |
| * Copyright (c) 2010-2021 Google, Inc. All rights reserved. |
| * **********************************************************/ |
| |
| /* Dr. Memory: the memory debugger |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; |
| * version 2.1 of the License, and no later version. |
| |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| */ |
| |
| /** |
| **************************************************************************** |
| **************************************************************************** |
| \page page_build Building from Sources |
| |
| # Source Code |
| |
| The source code can be obtained from our git repository. Be sure to run the `devsetup.sh` script to set up the git aliases for [our workflow](\ref page_contribute). |
| |
| ``` |
| $ git clone https://github.com/DynamoRIO/drmemory.git |
| $ cd drmemory |
| $ make/git/devsetup.sh |
| ``` |
| |
| # Pre-Built Packages |
| |
| If you don't need to modify Dr. Memory and just want a build more recent than the last official release, we provide [weekly package builds](Latest-Build). |
| |
| # GitHub Zip Download Not Supported |
| |
| We do not support building from the "Download Zip" GitHub feature, as it A) fails to support submodules and B) thwarts our patchlevel setting mechanism (xref https://github.com/DynamoRIO/dynamorio/issues/1565). |
| |
| # Components |
| |
| The Dr. Memory code base contains two tools: |
| -# Dr. Memory: memory debugging tool |
| -# Dr. Heapstat: memory profiling tool |
| |
| Which tool to build is determined by whether the TOOL_DR_HEAPSTAT CMake |
| variable is enabled. |
| |
| Both tools use the [DynamoRIO dynamic instrumentation tool platform](http://dynamorio.org). The sources for the version of DynamoRIO needed is included as a git submodule in the dynamorio/ subdirectory. By default, a Dr. Memory build also builds DynamoRIO from these embedded sources. You can also point at a separate DynamoRIO build if you have built it or downloaded it separately, using the DynamoRIO_DIR CMake variable. |
| |
| # Windows Setup |
| |
| You'll need to install a compiler, the Debugging Tools for Windows, CMake, and a few other tools in order to build Dr. Memory |
| on Windows. Since Dr. Memory also builds DynamoRIO, you can follow the |
| [setup instructions for DynamoRIO](https://dynamorio.org/page_building.html). We summarize what is needed here for the specific DynamoRIO build built by Dr. Memory. |
| |
| ## Compiler |
| |
| For the compiler, install Visual Studio 2013. We have never tested building from within the |
| Visual Studio IDE, but it should work (CMake can generate Visual Studio |
| project files as well as Makefiles). If you try it, please update these |
| instructions. From the command line, set up the path and environment |
| variables for Visual Studio as normal: run the `vcvars` batch file, either manually in a cmd shell or by running the Visual Studio Command Prompt which has a Start Menu entry under Visual Studio Tools, |
| or translate the vcvars environment variables into cygwin bash. |
| |
| ## Debugging Tools for Windows |
| |
| Dr. Memory needs redistributable copies of dbghelp.dll and symsrv.dll. |
| These are available in a Visual Studio or SDK installation that has the |
| Remote Debugger installed, in the Windows 8 SDK, and in the WDK or DDK. |
| Visual Studio Express seems to have the right files but has not been tested |
| for all versions. |
| |
| If you choose to use the WDK or DDK, we have tested the Windows |
| Driver Kit version 7.1.0 (7600.16385.1), the Windows Vista WDK (6000), and |
| the Windows 2003 DDK (3790.1830). If you install into a non-default |
| location (i.e., other than `$SYSTEMDRIVE/WINDDK/3790.1830` or |
| `$SYSTEMDRIVE/WINDDK/6000`) then you must point the DDKROOT environment |
| variable at the base of the DDK/WDK: |
| |
| ``` |
| export DDKROOT=`cygpath -dm ~/WINDDK/6000/` |
| ``` |
| |
| Alternatively, you can point at a redistributable copy of dbghelp.dll of at |
| least version 6.3 with the CMake variable DBGHELP_DLL and at a version of |
| symsrv.dll with the CMake variable SYMSRV_DLL. |
| |
| ## CMake |
| |
| You need CMake for Windows (*not* for Cygwin, as we need to pass paths with |
| drive letters to our compiler), at least version 3.7. You can download a |
| binary installation here: |
| |
| http://www.cmake.org/cmake/resources/software.html |
| |
| Install CMake and put its bin directory on the path for your shell. |
| |
| ## Other Tools |
| |
| To build the Dr. Heapstat data visualizer, the Flex SDK and Java are |
| required. We have tested versions 3.3, 3.4, and 4.1 of the Flex SDK. It |
| can be obtained from http://www.adobe.com/go/flex4_sdk. Set the CMake |
| variable BUILD_VISUALIZER to ON, and then set the CMake variable FLEX_SDK |
| to point at the base of the directory where you unzipped the SDK files, or |
| set the FLEXROOT environment variable to point there: |
| |
| ``` |
| export FLEXROOT=/home/bruening/work/flex_sdk_4.1 |
| ``` |
| |
| For Java, if the java interpreter is not found by CMake, set the JAVA CMake |
| variable. On Windows all that's needed is the Java runtime environment |
| (e.g., from http://www.oracle.com/technetwork/java/javase/downloads/index.html). |
| |
| You can build the Dr. Heapstat data gathering tool without either Flex or |
| Java. By default, that's what is built: only if the BUILD_VISUALIZER CMake |
| variable is enabled is the visualizer built. Be aware that the visualizer |
| is a prototype built several years ago and it may not work out of the box |
| on modern browsers, in particular on Windows. We are looking for |
| contributors to build a new visualizer. |
| |
| In order to build the documentation, you will additionally need doxygen, |
| which can be either a Cygwin package or native Windows. Currently the |
| documentation is always built, so this is required. |
| |
| To build a Windows installation packagage (with an installer, instead of |
| just a zip file for local installs), you will need to have |
| [NSIS](http://nsis.sourceforge.net) installed. If NSIS is not found, there |
| will not be an error, but only the zip package on Windows will be built. |
| Your NSIS install must be patched with the ["Large Strings" build](http://nsis.sourceforge.net/Special_Builds) in order to support long PATHs. A configure-time check ensures this is in place. See [Issue 1029](http://code.google.com/p/drmemory/issues/detail?id=1029) for more information. |
| |
| In order to build DynamoRIO you must have a version of perl. It can be |
| either a Cygwin perl or a native Windows perl. |
| |
| ---------------- |
| |
| # Linux Setup |
| |
| In order to build you'll need the following packages: |
| |
| - gcc |
| - binutils |
| - cmake (at least version 3.7) |
| - perl |
| - libunwind-dev |
| |
| To build Dr. Heapstat you will additionally need: |
| |
| - Flex SDK |
| - Java |
| |
| In order to build the documentation, you will additionally need: |
| |
| - doxygen |
| |
| If your machine does not have support for running 32-bit applications and |
| its version of binutils is older than 2.18.50 then you'll need to set the |
| `CMAKE_ASM_COMPILER` CMake cache variable to point at a GNU assembler of at |
| least version 2.18.50. |
| |
| If you're using a 64-bit Linux distribution, be sure to install 32-bit |
| development support (for Ubuntu, the `g++-multilib` package). |
| |
| ---------------- |
| |
| # Building with CMake |
| |
| If you have all the required tools installed in standard locations, CMake |
| will find them automatically. Only the Flex SDK and the DDK (which is only |
| needed with non-full installations of Visual Studio) are likely to |
| not be found as they do not normally live in system install directories. |
| If you set the FLEXROOT and DDKROOT environment variables as specified |
| above, then CMake should find all your tools without any custom CMake |
| variable settings. |
| |
| ## Configuring Your Build |
| |
| First, configure your compiler. On Windows this means setting up the |
| environment variables (including `PATH`). On Linux, if your compiler |
| supports both 64-bit and 32-bit targets, you can select the non-default |
| type by setting the `CFLAGS` and `CXXFLAGS` environment variables to the |
| flags used to change your compiler's target. For example, for gcc: |
| |
| ``` |
| export CXXFLAGS=-m32 |
| export CFLAGS=-m32 |
| ``` |
| |
| Next, in your shell (which you have set up for building with your |
| compiler), create a build directory. Out-of-source builds are supported |
| and recommended. |
| |
| You can configure using the CMake GUI or directly from the command line. |
| We describe the GUI method first. To use the GUI, invoke it from the build |
| directory, pointing at the source directory. For example, if your current |
| directory is the base of the DynamoRIO tree: |
| |
| On Windows, from a Cygwin bash shell: |
| ``` |
| mkdir build |
| cd build |
| CMakeSetup .. |
| ``` |
| |
| On Linux: |
| ``` |
| mkdir build |
| cd build |
| cmake-gui .. |
| ``` |
| |
| Alternatively, `ccmake`, the curses-based GUI, can be used on Linux. |
| |
| On Windows, press "Configure" and select "Visual Studio 9 2008" or "Visual |
| Studio 8 2005); on Linux, press Configure and then select "Unix Makefiles" |
| (or, in `ccmake`, press `c` once). |
| |
| Now you can select the parameters to configure your build. The main |
| parameters are as follows: |
| |
| - TOOL_DR_HEAPSTAT = whether to build Dr. Heapstat instead of Dr. Memory |
| - CMAKE_BUILD_TYPE = whether to build Debug or RelWithDebInfo |
| |
| Note that the DynamoRIO build options are present as advanced options but |
| in general should be ignored as Dr. Memory sets the appropriate settings. |
| |
| Press Configure and then OK (or `c` and then `g`) to complete the |
| configuration step and generate the Makefiles. It is normal to see |
| messages like this for various types (uint, ushort, bool, byte, sbyte, |
| uint32, uint64, int32, int64): |
| |
| ``` |
| -- Check size of bool |
| -- Check size of bool - failed |
| ``` |
| |
| This is really a check for the existence of a typedef and it is normal for |
| some such checks to print a "failure" message. |
| |
| On Windows, if you have both `cl` and `gcc` on your path, you can ensure |
| that CMake selects `cl` by setting the `CC` and `CXX` environment |
| variables. For example: |
| |
| ``` |
| CC=cl CXX=cl cmake .. |
| ``` |
| |
| To improve compilation speed on Windows, if you have CMake 2.8 or later, |
| you can turn off the progress and status messages with this CMake define: |
| |
| ``` |
| -DCMAKE_RULE_MESSAGES:BOOL=OFF |
| ``` |
| |
| ## Building and Installing |
| |
| After the configuration step is complete, type `cmake --build .` |
| on Windows or `make` on Linux. |
| |
| For a release build on Windows, you'll need to use: |
| ``` |
| cmake --build . --config RelWithDebInfo |
| ``` |
| |
| ## Configuring in Batch Mode |
| |
| Instead of interactive configuration you can pass all your parameter |
| changes to CMake on the command line. For example: |
| |
| On Windows, with code checked out into the current directory named `src`: |
| ``` |
| mkdir ../build |
| cd ../build |
| cmake -G"Visual Studio 9 2008" -DCMAKE_BUILD_TYPE=Debug ../src |
| cmake --build . |
| ``` |
| |
| On Linux, with code checked out into the current directory named `src`: |
| ``` |
| mkdir ../build |
| cd ../build |
| cmake -DCMAKE_BUILD_TYPE=Debug ../src |
| make |
| ``` |
| |
| Developers may wish to pass `-DCMAKE_VERBOSE_MAKEFILE=1` to CMake in order |
| to see the compilation command lines. They can alternatively be seen for |
| any individual build with `make VERBOSE=1`. |
| |
| ## Re-Configuring |
| |
| You can re-run the configure step, using the same parameters that you |
| originally used, in two ways: |
| |
| ``` |
| make rebuild_cache |
| ``` |
| |
| Or: |
| |
| ``` |
| cmake . |
| ``` |
| |
| With the latter command you can also change the configuration, but be sure |
| to do a `make clean` prior to building as CMake does not perform |
| dependence checking on this type of modification. As an example: |
| |
| ``` |
| cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo . |
| make clean |
| ``` |
| |
| ## Using Ninja For Better Error Messages, Faster Builds, and Proper Incremental Builds |
| |
| Ninja is a new build system that provides a much better build experience |
| from the command line. We highly recommend using it on Windows. Follow |
| the |
| [DynamoRIO instructions for using Ninja](https://dynamorio.org/page_building.html#sec_ninja). |
| |
| ## Using MSBuild For Better Error Messages And Faster Builds |
| |
| We recommend Ninja (see above) over MSBuild, but we're leaving the |
| information on MSBuild here as it is recommended over devenv. |
| |
| By default, CMake will use devenv when building for Visual Studio generators. |
| An exception is CMake 2.8.4, which uses MSBuild by default, but does not build |
| in parallel without passing the "/m" flag to MSBuild: |
| |
| ``` |
| cmake --build . --target RelWithDebInfo -- /m |
| ``` |
| |
| MSBuild summarizes all build warnings and errors at the end of the run, unlike |
| devenv. It is also a little faster than devenv (when parallel building is |
| enabled). There are some general outstanding issues with MSBuild, but it seems |
| to work well for Dr. Memory with Visual Studio 2010. To request MSBuild set the |
| CMAKE_MAKE_PROGRAM variable at configuration time. In a Visual Studio Command |
| Prompt, MSBuild is on the PATH, so the absolute path is not needed (here the code is checked out into the current directory named `src`): |
| |
| ``` |
| cmake -G"Visual Studio 10" -DCMAKE_MAKE_PROGRAM:FILEPATH=MSBuild ../src |
| ``` |
| |
| Don't forget to pass the "/m" flag (after "--") as shown above when building. |
| |
| To request verbose build information, use the "/v:diag" flag: |
| |
| ``` |
| cmake --build . --target RelWithDebInfo -- /m /v:diag |
| ``` |
| |
| Here is a sample bash function to make building easier within Cygwin: |
| |
| ``` |
| function build { |
| config=`grep ^CMAKE_CONFIGURATION_TYPES:S CMakeCache.txt | sed 's/^.*=//'` |
| /usr/bin/time cmake --build . --config $config -- /m |
| } |
| ``` |
| |
| ## Building the Qt Dr. Heapstat visualizer |
| |
| See the [Qt DrGUI extension build instructions for DynamoRIO](https://dynamorio.org/page_building.html#sec_drgui). |
| |
| ---------------- |
| |
| ## Cross-Compiling for ARM on Linux |
| |
| Install the cross compiler for the `gnueabihf` target: |
| |
| ``` |
| $ sudo apt-get install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf g++-arm-linux-gnueabihf |
| ``` |
| |
| Check out the sources as normal, and point at our toolchain CMake file: |
| |
| ``` |
| $ git clone https://github.com/DynamoRIO/drmemory.git |
| $ cd drmemory |
| $ make/git/devsetup.sh |
| $ cd .. |
| $ mkdir build_arm |
| $ cd build_arm |
| $ cmake -DCMAKE_TOOLCHAIN_FILE=../drmemory/dynamorio/make/toolchain-arm32.cmake ../drmemory |
| $ make -j |
| ``` |
| |
| ---------------- |
| |
| ## Cross-Compiling for ARM Android |
| |
| Install the Android NDK and configure it for the androideabi standalone toolchain. Something like this: |
| |
| ``` |
| /myndkpath/android-ndk-r10e/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=/mytooldir/android-ndk-21 --toolchain=arm-linux-androideabi-4.9 |
| ``` |
| |
| Switch from the gold linker to bfd: |
| |
| ``` |
| ln -sf arm-linux-androideabi-ld.bfd /mytooldir/android-ndk-21/bin/arm-linux-androideabi-ld |
| ``` |
| |
| You'll need a cmake version greater than 3.0.2 -- otherwise you'll see this error: |
| |
| ``` |
| System is unknown to cmake, create: |
| Platform/Android to use this system, please send your config file to ... |
| ``` |
| |
| Now check out the sources as normal, and point at our toolchain CMake file. |
| |
| ``` |
| $ git clone https://github.com/DynamoRIO/drmemory.git |
| $ cd drmemory |
| $ make/git/devsetup.sh |
| $ cd .. |
| $ mkdir build_android |
| $ cd build_android |
| $ cmake -DCMAKE_TOOLCHAIN_FILE=../drmemory/dynamorio/make/toolchain-android-gcc.cmake -DANDROID_TOOLCHAIN=/mytooldir/android-ndk-21 ../drmemory |
| $ make -j |
| ``` |
| |
| If your Android system does not have a writable `/data/local/tmp` directory, you will need to either set `DYNAMORIO_CONFIGDIR` to a writable location or always run from a writable current directory. |
| |
| If you have an Android device set up for access through the `adb shell` utility, the Android build is capable of automatically copying binaries to the device and running tests. First, ensure that `adb` is on your PATH, and that `adb status` indicates an attached device. Next, set the cmake variable `DRM_COPY_TO_DEVICE`. This sets up post-build steps for each target needed by the tests to copy binaries over to the device. Now `ctest` should work when run from the host machine. |
| |
| ---------------- |
| |
| # Building a Release Package |
| |
| We use Github Actions to build official release packages of |
| Dr. Memory. This section describes how to build a local package. |
| |
| Use the package.cmake CTest script to build a release package. On Linux, |
| this is a tarball; on Windows, both a zip file and an installation |
| executable are built. The Windows installer is only built, however, if |
| [NSIS](http://nsis.sourceforge.net) is installed on your machine. See the instructions under Other Tools for how to appropriately patch NSIS. |
| |
| Launch package.cmake using `ctest -S`. Here is an example of building a |
| Dr. Memory package from the current sources: |
| |
| ``` |
| git clone https://github.com/DynamoRIO/drmemory.git |
| cd drmemory |
| make/git/devsetup.sh |
| cd .. |
| mkdir build_package |
| cd build_package |
| ctest -S ../drmemory/package.cmake,drmem_only\;build=1 |
| ``` |
| |
| The arguments to a ctest script are ;-separated (but the ; must be escaped |
| for most shells) and separated from the script name by a comma. |
| |
| To set a CMake variable for a CTest script, create a file and pass it |
| in via the preload argument to package.cmake. |
| |
| To diagnose build failures, look at the detailed output in the log files for each step (configure, build, test) in the `Testing/Temporary/` directory inside each build directory. |
| |
| **************************************************************************** |
| **************************************************************************** |
| */ |