* Remove Windows msvc project files and move build instructions to single BUILDING.md file. * Move HACK.txt to Contributing and update it. * Add refactoring guide. * Add known bugs * Remove compatibility headers. * Fix smaller issues. * Remove 'possible revert' column. People always can do manual changes. * Move instruction alias description to the top * Add table to general breaking changes. * Update general release guide with the newest information. * Highlight NanoMips and be more precise in writing. * Add note about archs without alias. * Add sentence about what is planned. * Small corrections for Windows build instructions and debug macros. * Fix rebase issues. * Bring back make.sh for the CI
4.3 KiB
Code structure
Capstone source is organized as followings.
. <- core engine + README.md + BUILDING.md etc
├── arch <- code handling disasm engine for each arch
│ ├── AArch64 <- AArch64 engine
│ ├── Alpha <- Alpha engine
│ ├── ARM <- ARM engine
│ ├── BPF <- Berkeley Packet Filter engine
│ ├── EVM <- Ethereum engine
│ ├── HPPA <- HPPA engine
│ ├── M680X <- M680X engine
│ ├── M68K <- M68K engine
│ ├── Mips <- Mips engine
│ ├── MOS65XX <- MOS65XX engine
│ ├── PowerPC <- PowerPC engine
│ ├── RISCV <- RISCV engine
│ ├── SH <- SH engine
│ ├── Sparc <- Sparc engine
│ ├── SystemZ <- SystemZ engine
│ ├── TMS320C64x <- TMS320C64x engine
│ ├── TriCore <- TriCore engine
│ └── WASM <- WASM engine
├── bindings <- all bindings are under this dir
│ ├── java <- Java bindings
│ ├── ocaml <- Ocaml bindings
│ └── python <- Python bindings
│ └── cstest <- Testing tool for the Python bindings.
├── suite <- Several tools used for development
│ ├── cstest <- Testing tool to consume and check the test `yaml` files in `tests`
│ ├── fuzz <- Fuzzer
│ └── auto-sync <- The updater for Capstone modules
├── contrib <- Code contributed by community to help Capstone integration
├── cstool <- Cstool
├── docs <- Documentation
├── include <- API headers in C language (*.h)
├── packages <- Packages for Linux/OSX/BSD.
├── windows <- Windows support (for Windows kernel driver compile)
├── tests <- Unit and itegration tests
└── xcode <- Xcode support (for MacOSX compile)
Building
Follow the instructions in BUILDING.md for how to compile and run test code.
Testing
General testing docs are at tests/README.md.
You can test single instructions easily with the cstool
.
For example:
$ cstool x32 "90 91"
Using cstool
is also the prefered way for debugging a single instruction.
Bindings
Bindings currently have not equivalent to a cstool
.
The Python bindings have cstool
implemented.
Other bindings are out-of-date for a while because of missing maintainers. They only have legacy integration tests.
Please check the issues or open a new one if you intent to work on them or need them.
Coding style
- We provide a
.clang-format
for C code. - Python files should be formatted with
black
.
Support
Please always open an issue or leave a comment in one, before starting work on an architecture! We can give support and save you a lot of time.
Updating an Architecture
The update tool for Capstone is called Auto-Sync
and can be found in suite/auto-sync
.
Not all architectures are supported yet.
Run suite/auto-sync/Updater/ASUpdater.py -h
to get a list of currently supported architectures.
The documentation how to update with Auto-Sync
or refactor an architecture module
can be found in suite/auto-sync/README.md.
If a module does not support Auto-Sync
yet, it is highly recommended to refactor it
instead of attempting to update it manually.
Refactoring will take less time and updates it during the procedure.
The one exception is x86
. In LLVM we use several emitter backends to generate C code.
One of those LLVM backends (the DecoderEmitter
) has two versions.
One for x86
and another for all the other architectures.
Until now it was not worth it to refactoring this unique x86
backend. So x86
is not
supported currently.
Adding an Architecture
If your architecture is supported in LLVM or one of its forks, you can use Auto-Sync
to
add the new module.
Checkout suite/auto-sync/README.md.
Otherwise, you need to implement the disassembler on your own and make it work with the Capstone API.