Diablo is a retargetable link-time binary rewriting framework. While our focus has been mostly on program compaction, binary rewriting has a much broader range of applications: speed optimizations, power consumption optimizations, size optimizations, program obfuscation and watermarking, instrumentation, etc. A binary rewriting framework is also very useful for program analysis and understanding. For instance, Diablo can print out the control flow graph for all functions in a program, annotated with for example liveness information.

Overview

logo.png

What is Diablo:

  • Diablo is a rewriting linker: its inputs are the object files and libraries from which the program is built, instead of just the program executable. A drawback of this approach is that Diablo is not useful for purposes such as binary translation, where binary programs are translated to run on a completely different architecture.
  • Diablo is safe: because of the extra information that is available at link time (in particular relocation information), it is possible to correctly interpret the complete binary, something that is not always possible without this information.
  • Diablo is retargetable. At the moment, ports exist for the ARM, i386, x86_64, PowerPC32 and PowerPC64 architectures. In the past, it has also supported MIPS, Alpha, IA64 and x86_64. A partial port for the Cell BE is also available.

Diablo is a prototype tool, intended primarily for research. As such, we cannot guarantee it to be production-quality code, even though we have an extensive collection of regression tests that try to ensure Diablo is as bug-free as possible. There are some caveats in using Diablo:

  • Diablo generally only works on statically linked programs. There is some support for dynamically linked programs, but it is limited.
  • Diablo actually needs a little more information about a program than most standard tool chains provide. If you want to use Diablo on programs generated by a GCC-based tool chain, you need to apply some patches to your tool chain first. These patches do not influence the code that is generated, they just preserve some information about the code and data that would otherwise be lost after compilation. These patches can be downloaded from this web site. Alternatively, we offer a number of precompiled toolchains for different architectures with the patches already applied.

Where to get it

See the Diablo home page.

Contact

Jonas Maebe
Bjorn De Sutter