/* ******************************************************************************
 * Copyright (c) 2010-2024 Google, Inc.  All rights reserved.
 * ******************************************************************************/

/*
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * * Neither the name of Google, Inc. nor the names of its contributors may be
 *   used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */

/**
 ****************************************************************************
\mainpage Home

\brief \copybrief page_home
\details \copydetails page_home

<div style="display:none;">
\subpage page_home
\subpage page_history
</div>

\page page_home Overview

DynamoRIO is a runtime code manipulation system that supports code
transformations on any part of a program, while it executes. DynamoRIO
exports an interface for building dynamic tools for a wide variety of uses:
program analysis and understanding, profiling, instrumentation,
optimization, translation, etc. Unlike many dynamic tool systems, DynamoRIO
is not limited to insertion of callouts/trampolines and allows arbitrary
modifications to application instructions via a powerful
IA-32/AMD64/ARM/AArch64 instruction manipulation library. DynamoRIO
provides efficient, transparent, and comprehensive manipulation of
unmodified applications running on stock operating systems (Windows, Linux,
or Android, with experimental Mac support) and commodity IA-32, AMD64, ARM,
and AArch64 hardware.

# Existing DynamoRIO-based tools

DynamoRIO is the basis for some well-known external tools:
- The [Arm Instruction Emulator (ArmIE)](https://developer.arm.com/Tools%20and%20Software/Arm%20Instruction%20Emulator)
- [WinAFL](https://github.com/googleprojectzero/winafl), the Windows fuzzing tool, as an instrumentation and code coverage engine
- The fine-grained profiler for ARM [DrCCTProf](https://xl10.github.io/blog/drcctprof.html)
- The portable and efficient framework for fine-grained value profilers [VClinic](https://github.com/VClinic/VClinic)
- The sampling-based sanitizer framework [GWPSan](https://github.com/google/gwpsan)

Tools built on DynamoRIO and available in the [release package](@ref page_download) include:

- The memory debugging tool [Dr. Memory](http://drmemory.org)
- The tracing and analysis framework [drmemtrace](@ref page_drcachesim) which can target instruction and memory address traces such as:
  - [Google data center workload traces](@ref google_workload_traces) for public analysis in the [drmemtrace](@ref page_drcachesim) format.
- The [drmemtrace](@ref page_drcachesim) framework includes multiple tools that operate on both online (with multi-process support) and offline instruction and memory address traces (such as the Google data center workload traces listed above):
  - The cache simulator [drcachesim](@ref sec_tool_cache_sim)
  - [TLB simulation](@ref sec_tool_TLB_sim)
  - [Reuse distance](@ref sec_tool_reuse_distance)
  - [Reuse time](@ref sec_tool_reuse_time)
  - [Opcode mix](@ref sec_tool_opcode_mix)
  - [Function call tracing](@ref sec_tool_func_view)
- The legacy processor emulator
  [drcpusim](@ref page_drcpusim)
- The "strace for Windows" tool [drstrace](http://drmemory.org/strace_for_windows.html)
- The code coverage tool [drcov](@ref page_drcov)
- The library tracing tool [drltrace](http://dynamorio.org/page_drltrace.html)
- The memory address tracing tool [memtrace](https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/memtrace_x86.c) ([drmemtrace](@ref page_drcachesim)'s offline traces are faster with more surrounding infrastructure, but this is a simpler starting point for customized memory address tracing)
- The memory value tracing tool [memval](https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/memval_simple.c)
- The instruction tracing tool [instrace](https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/instrace_x86.c) ([drmemtrace](@ref page_drcachesim)'s offline traces are faster with more surrounding infrastructure, but this is a simpler starting point for customized instruction tracing)
- The basic block tracing tool [bbbuf](https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/bbbuf.c)
- The instruction counting tool [inscount](https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/inscount.c)
- The dynamic fuzz testing tool [Dr. Fuzz](http://drmemory.org/page_drfuzz.html)
- The disassembly tool [drdisas](@ref page_drdisas)
- And more, including opcode counts, branch instrumentation, etc.: see \ref API_samples.

# Building Your Own Custom Tools

DynamoRIO's powerful API abstracts away the details of the underlying
infrastructure and allows the tool builder to concentrate on analyzing or
modifying the application's runtime code stream.  API documentation is
included [in the release package](@ref page_user_docs) and can also be
[browsed online](https://dynamorio.org/page_user_docs.html).
[Slides from our past tutorials](@ref page_slides) are also
available.

# Downloading DynamoRIO

DynamoRIO is available free of charge as a
[binary package for both  Windows and Linux](@ref page_download).
DynamoRIO's [source code is available](@ref page_source_code)
under a BSD license.

# Obtaining Help

Use the [discussion list](http://groups.google.com/group/DynamoRIO-Users)
to ask questions.

To report a bug, use the [issue
tracker](https://github.com/DynamoRIO/dynamorio/issues).

# Contributing

For information on how to contribute to the DynamoRIO project, see
\ref page_contributing.

# Origins

You can read about where the name DynamoRIO came from in the \ref page_history.


\page page_history History of DynamoRIO

DynamoRIO originated from a collaboration between MIT and Hewlett-Packard
in 2001.  HP Labs created the
[Dynamo](http://en.scientificcommons.org/42436731) system for
PA-RISC in the 1990's.  A port to IA-32 was begun in 2000 and continued in
collaboration with the Runtime Introspection and Optimization
(_RIO_) group at MIT.  The name originated from
combining _Dynamo_ with _RIO_.

# MIT Releases

Four versions were released to the public
and [hosted at MIT](http://cag.csail.mit.edu/dynamorio/):

- 0.9.1: June 2002 (release coincided with a PLDI tutorial)
- 0.9.2: October 2002 (ASPLOS tutorial)
- 0.9.3: March 2003 (CGO tutorial)
- 0.9.4: February 2005

# Determina

The DynamoRIO developers at MIT started a security company called Determina
using the DynamoRIO software.  Determina built its award-winning security
products, the Memory Firewall and Vulnerability Protection Suite, on top of
the DynamoRIO platform.

# VMware Releases

VMware acquired DynamoRIO in 2007.  Five versions were released from VMware
on [GoVirtual.org](http://govirtual.org):
- 0.9.5: April 2008 (only released to a CGO tutorial audience)
- 1.0 (a.k.a 0.9.6): August 2008 (GoVirtual.org launch)
- 1.1: September 2008
- 1.2: October 2008
- 1.3: February 2009

# Open-Source Releases on Google Code

DynamoRIO was open-sourced and its code uploaded to Google Code in
February 2009.  Versions from 1.4 through 5.0.0 were hosted there.

# Open-Source Releases on Github

DynamoRIO was moved to Github in December 2014.

# Logo

Our logo was created by [Natalee Ryan](https://natalee.info/).

 ****************************************************************************
 */
