Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jart/disaster
Disassemble C/C++ code under cursor in Emacs
https://github.com/jart/disaster
Last synced: 2 months ago
JSON representation
Disassemble C/C++ code under cursor in Emacs
- Host: GitHub
- URL: https://github.com/jart/disaster
- Owner: jart
- Created: 2013-03-02T15:43:16.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2024-08-22T07:09:27.000Z (5 months ago)
- Last Synced: 2024-08-22T08:27:12.999Z (5 months ago)
- Language: Emacs Lisp
- Homepage:
- Size: 637 KB
- Stars: 292
- Watchers: 10
- Forks: 30
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## disaster.el
*Disassemble C, C++ or Fortran code under cursor*---
[![License GPLv2](https://img.shields.io/badge/license-GPL_v2-green.svg)](http://www.gnu.org/licenses/gpl-2.0.html)
[![MELPA](http://melpa.org/packages/disaster-badge.svg)](http://melpa.org/#/disaster)![Screenshot of a C example](screenshot-c.png)
![Screenshot of a Fortran example](screenshot-fortran.png)
Disaster lets you press `C-c d` to see the compiled assembly code for the
C, C++ or Fortran file you're currently editing. It even jumps to and
highlights the line of assembly corresponding to the line beneath your cursor.It works by creating a `.o` file using `make` (if you have a Makefile), or
`cmake` (if you have a `compile_commands.json` file) or the default system
compiler. It then runs that file through `objdump` to generate the
human-readable assembly.### Installation
Make sure to place `disaster.el` somewhere in the `load-path`, then you should
be able to run `M-x disaster`. If you want, you add the following lines to
your `.emacs` file to register the `C-c d` shortcut for invoking `disaster`:```elisp
(add-to-list 'load-path "/PATH/TO/DISASTER")
(require 'disaster)
(define-key c-mode-map (kbd "C-c d") 'disaster)
(define-key fortran-mode-map (kbd "C-c d") 'disaster)
```#### Doom Emacs
For Doom Emacs users, you can add this snippet to your `packages.el`.
```elisp
(package! disaster
:recipe (:host github :repo "jart/disaster"))
```And this to your `config.el`:
```elisp
(use-package! disaster
:commands (disaster)
:init
;; If you prefer viewing assembly code in `nasm-mode` instead of `asm-mode`
(setq disaster-assembly-mode 'nasm-mode)(map! :localleader
:map (c++-mode-map c-mode-map fortran-mode-map)
:desc "Disaster" "d" #'disaster))
```### Customization Documentation
#### `disaster-make-flags`
Command line options to pass to make if a Makefile is found.
#### `disaster-assembly-mode`
Which mode to use to view assembly code.
#### `disaster-cc`
The command for your C compiler.
#### `disaster-cxx`
The command for your C++ compiler.
#### `disaster-fortran`
The command for your Fortran compiler.
#### `disaster-cflags`
Command line options to use when compiling C.
#### `disaster-cxxflags`
Command line options to use when compiling C++.!
#### `disaster-fortranflags`
Command line options to use when compiling Fortran.
#### `disaster-objdump`
The command name and flags for running objdump.
#### `disaster-buffer-compiler`
Buffer name to use for assembler output.
#### `disaster-buffer-assembly`
Buffer name to use for objdump assembly output.
#### `disaster-project-root-files`
List of lists of files that may indicate software project root directory.
Sublist are ordered from highest to lowest precedence.#### `disaster-c-regexp`
Regexp for C source files.
#### `disaster-cpp-regexp`
Regexp for C++ source files.
#### `disaster-fortran-regexp`
Regexp for Fortran source files.
### Function and Macro Documentation
#### `(disaster-create-compile-command-make MAKE-ROOT CWD REL-OBJ OBJ-FILEPROJ-ROOT REL-FILE FILE)`
Create compile command for a Make-based project.
MAKE-ROOT: path to build root,
CWD: path to current source file,
REL-OBJ: path to object file (relative to project root),
OBJ-FILE: full path to object file (build root!)
PROJ-ROOT: path to project root, REL-FILE FILE.#### `(disaster-create-compile-command-cmake MAKE-ROOT CWD REL-OBJ OBJ-FILEPROJ-ROOT REL-FILE)`
Create compile command for a CMake-based project.
MAKE-ROOT: path to build root,
CWD: path to current source file,
REL-OBJ: path to object file (relative to project root),
OBJ-FILE: full path to object file (build root!)
PROJ-ROOT: path to project root, REL-FILE FILE.#### `(disaster-get-object-file-path-cmake COMPILE-CMD)`
Get the .o object file name from a full COMPILE-CMD.
#### `(disaster-create-compile-command USE-CMAKE MAKE-ROOT CWD REL-OBJOBJ-FILE PROJ-ROOT REL-FILE FILE)`
Create the actual compile command.
USE-CMAKE: non NIL to use CMake, NIL to use Make or default compiler options,
MAKE-ROOT: path to build root,
CWD: path to current source file,
REL-OBJ: path to object file (relative to project root),
OBJ-FILE: full path to object file (build root!)
PROJ-ROOT: path to project root, REL-FILE FILE.#### `(disaster &optional FILE LINE)`
Show assembly code for current line of C/C++ file.
Here's the logic path it follows:
- Is there a complile_commands.json in this directory? Get the object file
name for the current file, and run it associated command.
- Is there a Makefile in this directory? Run `make bufname.o`.
- Or is there a Makefile in a parent directory? Run `make -C .. bufname.o`.
- Or is this a C file? Run `cc -g -c -o bufname.o bufname.c`
- Or is this a C++ file? Run `c++ -g -c -o bufname.o bufname.c`
- If build failed, display errors in compile-mode.
- Run objdump inside a new window while maintaining focus.
- Jump to line matching current line.
If FILE and LINE are not specified, the current editing location
is used.#### `(disaster-find-project-root &optional LOOKS FILE)`
General-purpose Heuristic to detect bottom directory of project.
First, this will try to use `(vc-root-dir)` to guess the project
root directory, and falls back to manual check wich works by scanning
parent directories of FILE (using `disaster--find-parent-dirs`) for certain
types of files like a `.projectile` file or a `Makefile` (which is less
preferred).
The canonical structure of LOOKS is a list of lists of files
to look for in each parent directory where sublists are ordered
from highest precedence to lowest. However you may specify
LOOKS as a single string or a list of strings for your
convenience. If LOOKS is not specified, it'll default to
`disaster-project-root-files`.#### `(disaster-find-build-root USE-CMAKE PROJECT-ROOT)`
Find the root of build directory.
USE-CMAKE: non nil to use CMake's compile_commands.json,
PROJECT-ROOT: root directory of the project.-----