Releases: uxmal/reko
Version 0.12.2
This maintenance release consists mostly of bug fixes, but also contains some new features. Some of these are:
-
Added support for Renesas RxV2, Seiko-Epson C33 CPU, Infineon M8C, CSR Kalimba, Motorola 88k, and National Semiconductor NS32k processor architectures. Reko now supports 97 processor architectures!
-
Made it possible to override the operating environment from the command line using the
--env <environment-name>switch. -
Consolidated some of the architecture implementations into fewer
.csprojfiles. Currently the Reko solution is around 150.csprojfiles, and reducing this number improves the compilation times a bit. -
Changed
ConditionOfto require a data type. PreviouslyConditionOfalways had a data type of (8-bit) Byte , but not all architectures
have 8-bit processor status registers. In addition, many invalid assignments were being generated as a result. -
Recognize SysV intrinsic functions. GCC libc has low-level functions for long multiplication (
__muldi3), point addition (__adddf3) etc. Reko now recognizes these and adjusts parameters accordingly. -
Added NanoO32 calling convention to the MIPS architecture.
-
Refactored
MockGeneratorso that it uses aIMockIdentifierWriterto render variable definitions according to whether aProcedureBuilderor anSsaProcedureBuilderis being used to generate C# code. This helps in generating test cases quickly from crashes for easier debugging.
Thanks to @throwaway96 for his contribution to this release!
Version 0.12.1
A new minor release of Reko is available. The main focus of the release has been to provide better XML documentation, which has been requested by users.
-
XML documentation is now available for all classes in the
Reko.CoreandReko.Decompilerassemblies. In addition the build now treats missing XML documententation on types and type members as compiler errors. This will enforce a higher standard of documentation moving forward. -
The Reko.Decompiler.Runtime Nuget now includes the XML documentation.
-
Support for disassembling and lifting PDP-1 machine code was added. I'm fairly confident that Reko is currently the only decompiler supporting this venerable architecture!
-
Added support for OKI NX8/200 and NX8/500 architectures.
-
Added support for Intel's APX instruction prefix.
-
General code cleanup and fixes. Removed many classes that have become obsolete over the years.
-
@smx-smx provided a fix for a crash in the ELF loader when loading ELF files with unknown ABIs.
-
Fixed the command line driver to better handle command line arguments when disassembling raw images.
-
More work on ScannerV2 to handle delay slots correctly on Sparc, Mips, and PA-RISC architectures.
-
Added support for loading little-endian 64-bit PowerPC ELF images.
-
Eliminated the
OutArgumentStorageclass. This class was confusing and hard to use. It has been replaced by the newOutputscollection onFunctionTypewhich tracks
the registers used for returning values from procedure calls. -
The new method
ITestGenerationService.GenerateUnitTestFromProcedurecan now generate compileable C# code when crashes occur. This will greatly improve handling user-reported problems.
Special thanks to @smx-smx for troubleshooting various ELF loading issues.
Version 0.12.0
Reko version 0.12.0 has been released. It has the following features and changes:
-
The solution has been upgraded to .NET 8. Downstream projects using the
Reko.Decompiler.RuntimeNuGet and running on earlier versions of .NET will
have to upgrade to .NET 8 or later to use this version. -
The
Expressionclass was refactored to an interface. Doing this allowed the
refactoring of theAddressclass to astruct. Similarly, theMachineOperand
class was refactored to an interface. This allowedReko.Core.Constantand
Reko.Core.Addressto implement theMachineOperandinterface. TheAddress
type is one of the most heavily used types in the Reko project, and making it
a struct measurably improves Reko's execution time and memory consumption
performance. -
Added support for the following processor architectures:
- DEC PDP-7
- Panasonic MN103
- NEC SX-Aurora
- Maxim MaxQ
- Beyond BA
As usual with new architectures, they will be rough around the edges until
they get attention. The Reko project greatly appreciates volunteers who can
provide sample binaries to stress these new implementations.
-
Scanner V2 improvements. In the background, Reko is preparing for a big
change in how it processes input files. Regrettably, time constraints are
slowing down the progress in this direction. Once completed, Scanner V2 will
be the main feature of Reko's v1.0 release. -
Octal constants with a "0o" prefix. This is not compliant with C/C++.
Future versions of Reko will use the normal "0" prefix for octal numeric
literals. -
Support was added for user-provided Reko plugins by implementing the
Reko.Core.Plugins.IPlugininterface, as documented here. -
Support for BBC Micro DFS archives added
-
Various other small fixes.
Special thanks to @smx-smx for his assistance in repairing broken CI builds.
Version 0.11.6
A long overdue release has finally emerged. The changes are mostly incremental improvements of both the decompiler outputs and of the decompiler code base itself. Some highlights are:
-
Rearchitecting of the
ILoader/Loaderinterface and class. -
Introduced the
IBinaryImageinterface that abstracts a binary image. The intent is to add adumpsubcommand to the Reko command line client to make browsing of binaries convenient. -
added support for WASM 3.0 instructions.
-
added support for MN103, M16C, Telink TC32, and Angstrem KR1878 CPU architectures
-
added support for most of C-Sky floating point instructions.
-
added support for CP/M LBR archives
-
Reimplemented the handling of the CP/M BDOS dispatcher correctly.
-
All Z80 instructions have rewriters now.
-
Support for VAX Unix system calls
-
Fixed many bugs in the 6502 emulator
-
added support for calling MS-DOS and DPMI INT services from Win16Platform
-
added support for long constant fusion to all the major RISC architectures. The disassembly of (
load-high/load-low) instruction pairs is now easier to read. -
improved handling handling of procedures returning flag bits
-
added support for the
[[reko::segment]]attribute in C/C++ header files -
added support for VAX
a.outobject files -
implemented missing logic in
WildPatternMatcher+ re-enable unit tests -
refactored data flow analysis classes as implementations of the
IAnalysis<>interface * Refactor core Analysis classes toReko.Coreso that architecture-specific analyses can be implemented without adding dependencies toReko.Decompilerassembly. -
decompiled procedure arguments are ordered according to the ABI. Reko also tries to detect which ABI was used to compile procedures, if many ABIs are available on a particular platform.
-
better sequencing of VLIW instructions (see Hexagon implementation for details)
Version 0.11.5
This Reko release contains a variety of new features and improvements.
New contributor @gregoral made huge improvements to Reko's Risc-V support:
added decoders and rewriters for many new Risc-V instructions both unprivileged
and privileged, fixed many bugs in existing instruction decoders, and provided
a new instruction renderer for the architecture. Reko's Risc-V disassembly output
can now be assembled by other toolchains -- it's round-trippable.
Contributor @throwaway96 continued improving support for the mysterious
AEON architecture, and various enhancements in the Reko implementation of the
C preprocessor. Now there is a #define symbol __REKO_DECOMPILER__ that is
set to 1 when parsing C header files with Reko.
Progress on the platform-indepentent Avalonia GUI is slow but continuous.
The project was moved to Avalonia 11 from the previous 0.10 verson. A major
milestone was reached when the MemoryControl and TextView classes were finally ported to Avalonia.
The only remaining custom controls remaining, the VisualizerView and the ImageMapView
controls, are scheduled to be completed in the coming weeks. The Avalonia user interface
is soon going to reach feature parity with the Windows Forms interface.
Contributor @ptomin continued improving Reko's type inference engine. We are
reaching a point where limitations in the general strategy of Reko's type inference
are hindering progress. An alterative type analysis, based on subtype constraints, is
being researched.
Contributor @smx-smx labored on the build system with various performance
improvements and bug fixes in preparation for support of .NET 8
Some other changes:
- Reko now reads PE executables looking for the PE debug directory.
- Very rudimentary PDB reading support is present. It's a starting point
for extracting symbolic information from binaries with associated PDB
files. - Fixes to the WASM rewriter.
- Much improved support for COFF and OMF file formats
- All known CR16c instructions now supported.
- All known AVR32 instructions now supported.
- Support for distingushing 16- and 20-bit MSP 430 instruction sets.
- Added support for C-Sky architecture.
- Stub implementations of Zilog Z8000 and eZ8 architectures.
- Corrected behavior for Sparc SAVE/RESTORE instructions.
- Introduced a new
IMemoryabstraction that hides the details
of segmentations. New code is expected to using this new interface rather
than manually looking up addresses inSegmentMap. - Added support for Architecture aliases. For instance, the X86 architecture can
be referred to asi386orx86. - Support for the PalmOS platform, including handling A-line trap calls
on that platform and MacsBug symbol support. - New packing script for LzExe 0.91, written wholly in OllyScript and using Reko'scheduled
X86 emulation. - Handle '*' in
*printfformat strings. - Introduced
IFunctionalUnitabstraction to handle SIMD instructions in a
coherent way.
Thanks to @gregoral, @ptomin, @smx-smx, and @throwaway96 for their contributions and dedication.
Version 0.11.4
Another few months, another Reko minor release. Development continues in various directions.
In the architecture department, support was improved for various architectures, especually AEON and H8. X86 string instructions (rep movsb etc) are replaced by their C library equivalents (memcpy etc) (contributed by @ptomin). Bugs in the X86 and 6502 emulators were fixed.
Reko's C parser and preprocessor in particular received some attention. Nested #if/endif statements are now handled, various stability contributions were provided by @throwaway96.
The command line executable was changed from decompile.exe to reko.exe. It was refactored to support sub-commands. Currently those are
reko disasseble, which loads a file and disassembles its contentsreko decompile, which in addition performs data, type and structure
analysis.reko assemble, which allows users to assemble source files.
If no subcommand is specified, Reko will default todecompile.
Underneath the covers, the Reko decompiler is undergoing a slow but seismic refactoring. Progress was made in the new Scanner, which already is about 4x faster than the existing implementation. The Analysis phase was also refactored (via the new SccWorkerCoordinator class) to make it possible to run it multithreaded in the future. Across the board, global mutable state is being replaced with immutable data structures, or judiciously kept thread-safe by using appopriate critical sections and locks.
Reko will start understanding SIMD instructions better with the introduction of the SimdIntrinsic class.
The user interface is also seeing a slow but seismic overhaul. The Windows Forms GUI is refactored so that creating side-by-side interface elements in parallel with the Avalonia GUI is smoother. Various small GUI enhancements have been added, like support for flipping through architectures in the low level view. This feature allows the user to flip through Reko's architectures and see the results in the DisassemblyView. The new CallGraphNavigatorView improves the navigation of the decompiled program's call graph.
- A new unpacker for PKLITE v1.12-1.20
- Support for various
[[reko::...]]attributes in header files, especially
[[reko::characteristics]]. - Partial support for the OpenVMS platform.
- The pseudoregister
%continuationis used to reify the return address of
a calledProcedure. - Improved support for LE binaries.
- M68k fixed (with thanks to @gbody)
- More MS-DOS INT 21h services defined.
- Support translation of WASM IR into Reko IR.
- Added support for
calls-respect-abiheuristic. - Display the currently selected address range in the status bar (#1232)
- Added the Padauk PDK13,PDK14 and PDK15 instruction sets.
Thanks to @gbody, @mjunix, @ptomin, @smx-smx, and @throwaway96 for their contributions and dedication.
Version 0.11.3
The largest new feature of this release is the support for disassembling, rewriting, and emulation of instructions of the AEON (or BEON, or R2) processor. It is the first architecture in Reko implemented with no manual -- we've been unable to find the instruction set described in a publicly available resource. Instead, thanks to the hard work of @throwaway96, most of the instruction set has been reverse engineered. Many thanks for this great effort!
@smx-smx improved the stability of the build and eliminated redundant compilations of the build tools, resulting in a faster build overall.
Some other features added are:
-
Introduced the notion of
Unlikelyinstructions: instructions that while well-formed are unlikely to be present in a "normal" program. Reko can optionally be instructed to treat such unlikely instructions as invalid -
The user may also optionally instruct the Reko to treat protected/system instructions as invalid.
-
Since the move to .NET 6, Reko's custom 16-bit IEEE float implementation became redundant and was removed.
-
The GUI client now supports multiple scanning heuristics.
-
Support for user-defined segments was added.
-
Improvements in handling of varargs procedures.
-
Switch statements for MIPS, MIL-STD-1750A and Intel 8051 improved.
Thanks to @throwaway96 and @smx-smx for their contributions and support!
Version 0.11.2
My, has it been that long already since last release? Here's an overview of what's happened since.
The Reko solution was moved to .NET 6. As expected, performance and memory footprint was impoved.
The partially completed, still very much work-in-progress Avalonia development branch was merged into master. Moving forward, any changes in the GUI components will be mirrored in Windows Forms and Avalonia. For instance, the new Base Address finder tool window now exists for both GUI platforms.
Another big push is the move to support multithreaded scanning and analysis. Today, Reko uses only a single CPU thread for its CPU-intensive work. Partitioning the work as mutually independent workloads across multiple threads should see a great improvement in execution time. In order to accomplish this, several classes have been altered to only use read-only interfaces to global data, to prevent data race conditions. The work to eliminate globally visible mutable state continues.
Several new metadata annotations were added ( with the gentle prodding of @Elthial). You can now annotate C functions with the [[noreturn]] , [[reko::arg(seq...)]], and [[reko::address]] attributes.
Other bits and bobs:
- Improvements to
ArgumentGuesserto handle call sites where Reko can't prove the target address. - The codebase's namespaces were refactored to make them more easy to understand.
- Added or improved support for the following architectures: ARM, AArch64, BlackBin, Fujitsu F2MC16FX, MIPS, PDP-7, PowrPC, RiscV, MicroBlaze, SuperH SH2..SH4A, TriCore and x86 EVEX
- Support for discovering and parsing x86 and x86-64 MSVC RTTI .
- Fix calculation of alignment of unions (@ptomin)
- Refactored intrinsics for improved performance
- PharLap "MP" Exp file loader (#1169)
- MzExe: allow reading PEs without IAT (@smx-smx)
- Improved support for XEX executables (@smx-smx)
- Handle '*' in
*scanfformat strings.
Special thanks to @ptomin and @smx for their dedication and contributions.
Version 0.11.1
This maintenance release provides minor enhancements and bugfixes, including:
- More ARM32 rewriters.
- More uses of generic
IntrinsicProcedures. - Replace recursive
SccFinderwith an non-recursive implementation. - Initial support for Terse Executable format.
- Don't try tracing into nonexecutable code.
- Ctrl+0 resets the zoom level of the Graph Viewer
- Many more PowerPC instructions supported
- C parser issues reported by @smx-smx
- Make SSA analysis use bit-accurate analysis for stack variables.
- Multithreaded robustness.
It also has some refactorings and new classes, setting the stage for a future refactoring of the Scanner:
- New
RtlSwitchsubclass ofRtlInstruction - Support for platform-specific patterns for procedure entries.
Version 0.11.0
This release of Reko has breaking changes in interfaces and classes, and completes the move to .NET 5.0. Many classes were also moved to different namespaces: you'll need to recompile your project. The file loading code was refactored heavily to be easier to use and to support the reading of files stored in (potentially deeply nested) archives. Many fixes were made in the AArch64 rewriter (with gentle prodding from @rfalke).
Some other new features are:
- Wasm files can be loaded and disassembled. A rewriter will materialize in a later release.
- Reko Gui is asynchronous. This will help the ongoing port to Avalonia.
- Stack variable references that escape to other procedures are now tracked (courtesy of @ptomin).
- The new ByteTrie class can be used for pattern matching.
- Added support for PDP-10 architecture. The PDP-10 is word-addressable, has 36-bit words, 18-bit addresses, and variable sized bytes, all of which contrast vividly with present day 8-bit-based architectures.
- The MemoryControl displays sizes other than bytes. This accommodates PDP-10, Microchip PIC, and Mil-Std-1750A.
- Intrinsic procedures can now have generic parameter and return types.
- Added initial support for COFF files.
- Adapted OllyLangInterpreter to other architectures than X86.
- Added m6502 emulator, c64 emulator.
- Various CI improvements and fixes. Also, Reko now builds on ARM64! (courtesy of @smx-smx)
- Added support for constants larger than 64 bits.
- Support for reading TAR and AR archives.
- Support loading files from arbitrarily nested archives.
- Rewrote the loader so it is much easier to use (and understand).
- Extended C parser to handle more GCC attributes.
- Support for Sanyo LC8670.
Thanks to @nemerle, @ptomin, @shandianchengzi, @slartibardfast, and @smx-smx for their time and contributions to the Reko project!