Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
363dbdd
exex: better docs
rabarbra Jul 10, 2026
549917e
exex: curated chroma lexer/style subset
rabarbra Jul 2, 2026
3fcfe86
tmp
rabarbra Jul 2, 2026
d39e7c8
exex: modeView interface
rabarbra Jul 2, 2026
cb960ea
exex: refactor views to separate modules
rabarbra Jul 3, 2026
ed3ab73
exex: dyld cache reader resolution
rabarbra Jul 3, 2026
a0a3f2b
exex: relocs dyld finished
rabarbra Jul 3, 2026
4116de6
exex: "open in" modal
rabarbra Jul 3, 2026
e3b26b3
exex: global search modal, global search from caret
rabarbra Jul 3, 2026
9d749c7
exex: search RAM optimization
rabarbra Jul 3, 2026
84e4def
exex: case sensetive search, update in-view search ui
rabarbra Jul 3, 2026
0204609
exex: single source of truth for themes, expanded chroma subset
rabarbra Jul 10, 2026
afefded
exex: single modal overlay for all modal, mouse handling in modals is…
rabarbra Jul 10, 2026
c026680
exex: fix search bugs
rabarbra Jul 10, 2026
8b9bdc6
exex: dedupe, dead code removal
rabarbra Jul 10, 2026
755e331
exex: scanDisasmMatching moved to explorer.DisasmService.ScanMatching.
rabarbra Jul 10, 2026
1680e25
exex: refactoring modals: xrefs, settings
rabarbra Jul 10, 2026
773b299
exex: reafactoring modals: jumpto
rabarbra Jul 10, 2026
6232ed7
exex: refactoring modals: findto
rabarbra Jul 10, 2026
ea68383
exex: modals reafctoring: goto
rabarbra Jul 10, 2026
3ab6ffe
exex: modals refactoring: help
rabarbra Jul 10, 2026
eff189f
exex: refactoring modals: xrefs
rabarbra Jul 10, 2026
2cc3864
exex: refactor modals: findquery, findresult
rabarbra Jul 10, 2026
7836a3f
exex: refactoring modals: textoverlay, rawheader
rabarbra Jul 10, 2026
0bdf5e6
exex: refactoring modals: search
rabarbra Jul 10, 2026
093a9af
exex: background is applied now to footer and tabs
rabarbra Jul 10, 2026
cbefc76
exex: refactoring modals: syscalls
rabarbra Jul 10, 2026
3d2f279
exex: moved asm syntax highlighting to separate module - asmhl
rabarbra Jul 10, 2026
3fa896e
exex: disasm refactoring: lookup and span
rabarbra Jul 10, 2026
7b6eafb
exex: disasm refactoring: searchcache
rabarbra Jul 10, 2026
beb8190
exex: disasm refactoring: operand
rabarbra Jul 10, 2026
6be390e
exex: disasm refactoring: columns extracted to view
rabarbra Jul 10, 2026
8909e6d
exex: disasm refactoring: added disasm state
rabarbra Jul 10, 2026
e8bdbc0
exex: disasm refactoring: moved nav to view
rabarbra Jul 10, 2026
215e140
exex: performance: disasm LRU cache, streamed disasm search, files li…
rabarbra Jul 10, 2026
4cbaaad
exex: performance: better DWARF cache
rabarbra Jul 10, 2026
ecbe212
exex: disasm refactoring: render to view
rabarbra Jul 10, 2026
6c3f166
exex: disasm refactoring: source pane to disasm view module
rabarbra Jul 10, 2026
249d416
exex: disasm refactoring: moved sourcepane to disasm module
rabarbra Jul 10, 2026
00b904f
exex: disasm refactoring
rabarbra Jul 10, 2026
09aa86d
exex: refactoring: removed dead code
rabarbra Jul 11, 2026
435db3c
exex: disasm refactoring: mouse
rabarbra Jul 11, 2026
a64ab0b
exex: disasm refactoring: fixed perf regression
rabarbra Jul 11, 2026
d4ede74
exex: refactoring: keys helpers consistency
rabarbra Jul 11, 2026
82ede45
exex: allocations optimization
rabarbra Jul 11, 2026
9094b80
exex: allocations optimizations: hex view raw cache
rabarbra Jul 11, 2026
7d3f6e8
exex: allocations optimization: painter for lipgloss style
rabarbra Jul 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ shasum -a 256 -c checksums.txt

| Build | Size | Syntax highlighting |
|-------|------|---------------------|
| **full** (`exex-…-<os>-<arch>.tar.gz`) | larger | Chroma — full multi-language source + asm highlighting |
| **full** (`exex-…-<os>-<arch>.tar.gz`) | larger | Chroma — curated native/common source lexers + asm highlighting |
| **lite** (`exex-…-<os>-<arch>-lite.tar.gz`) | smaller | built-in minimal highlighter |

Everything else is identical, and both honour the same themes/colours. Exact archive sizes vary by platform and Go/dependency versions. Pick **lite** for the smaller binary, **full** for the richest colouring.
Everything else is identical, and both honour the same themes/colours. Source languages outside the curated Chroma set fall back to the built-in highlighter. Exact archive sizes vary by platform and Go/dependency versions. Pick **lite** for the smaller binary, **full** for the richest colouring.

### Usage

Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
exex
.vscode
dist
*.test
*.test
perfreport

# Regenerated by the golden-frame tests from internal/testbin; the snapshots in
# internal/ui/testdata/golden* are committed, this input is not.
internal/ui/testdata/tiny.elf
77 changes: 77 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# exex

A fast terminal UI for exploring **ELF, Mach-O and PE** binaries. exex shows the
file header, sections, segments, symbols, disassembly, hex/raw bytes, printable
strings, dynamic libraries, relocations, syscall sites and DWARF-driven source
mapping in one keyboard- and mouse-driven interface.
A fast terminal UI for exploring **ELF, Mach-O and PE** binaries. exex shows the
file header, sections, segments, symbols, disassembly, hex/raw bytes, printable
strings, dynamic libraries, relocations, syscall sites and DWARF-driven source
Expand All @@ -9,6 +13,9 @@ Its standout feature: when a binary has debug info (DWARF, or a Mach-O `.dSYM`),
exex shows the **original source side by side with the exact disassembly it maps
to**. It is interactive, navigable both ways, and entirely **static**: no
debugger, no running process, no decompiler.
exex shows the **original source side by side with the exact disassembly it maps
to**. It is interactive, navigable both ways, and entirely **static**: no
debugger, no running process, no decompiler.

```
exex [-debug PATH] [-s STRING] [-o [VIEW]] <binary> [goto]
Expand All @@ -17,6 +24,21 @@ exex [-debug PATH] [-s STRING] [-o [VIEW]] <binary> [goto]

## Highlights

- **One explorer for three formats:** ELF, Mach-O, PE and universal/fat Mach-O
slices.
- **Source ↔ disassembly:** original source beside machine code when DWARF or a
`.dSYM` is available.
- **Fast first look:** read-only, no project database, no debugger session.
- **Useful binary views:** symbols, sections, segments, strings, relocations,
libraries, syscall sites, CPU features, hex/raw bytes and disassembly.
- **Scriptable output:** `-o` emits plain text views for pipes and automation.
- **Text script mode:** readable shell/Python/etc. scripts open in a linked text
viewer instead of failing as “not a binary”.

See [How exex compares to other tools](#how-exex-compares-to-other-tools) for the
tradeoffs against binutils, debuggers and RE platforms.
## Highlights

- **One explorer for three formats:** ELF, Mach-O, PE and universal/fat Mach-O
slices.
- **Source ↔ disassembly:** original source beside machine code when DWARF or a
Expand Down Expand Up @@ -44,6 +66,8 @@ brew install shellcell/tap/exex
Download the asset for your OS/arch from the
[Releases](../../releases) page. Add `-lite` to the filename for the smaller
build.
[Releases](../../releases) page. Add `-lite` to the filename for the smaller
build.

```sh
# macOS / Linux
Expand All @@ -55,10 +79,12 @@ sudo mv exex /usr/local/bin/
shasum -a 256 -c checksums.txt
```

### Go install
### Go install

```sh
go install github.com/rabarbra/exex@latest # full build
go install github.com/rabarbra/exex@latest # full build
go install -tags lite github.com/rabarbra/exex@latest # lite build
```

Expand All @@ -75,6 +101,30 @@ make test-cross # cross-compile and parse/disassemble readable targets; needs G

There are two builds. They are identical except for syntax highlighting:

| Build | Size | Syntax highlighting |
|-------|------|---------------------|
| **full** | larger | [Chroma](https://github.com/alecthomas/chroma) — curated native/common source lexers and assembly highlighting |
| **lite** | smaller | a small built-in highlighter (categorized source keywords/function names; categorized asm mnemonics plus registers / immediates / links) |

The full build bundles a curated Chroma lexer/style set; source languages outside
that set fall back to the built-in highlighter. The lite build drops Chroma
entirely. Exact binary and archive sizes vary by platform and Go/dependency
versions, but lite is the smaller download. Both builds honour the same themes
and `colors:` config; the built-in highlighter follows your theme too.

Pick **lite** if you want the smaller binary, **full** for the richest colouring.

## Man Page and Shell Completions
make build # full -> ./exex
make lite # lite -> ./exex
make test # go test + lite vet
make test-cross # cross-compile and parse/disassemble readable targets; needs Go + Zig
```

## Full vs Lite Build

There are two builds. They are identical except for syntax highlighting:

| Build | Size | Syntax highlighting |
|-------|------|---------------------|
| **full** | larger | [Chroma](https://github.com/alecthomas/chroma) — full multi-language source highlighting and assembly highlighting |
Expand Down Expand Up @@ -231,6 +281,9 @@ scripts via `-o`.
| `addr2line` | address → source `file:line` via DWARF | live in the source pane and Sources view — address ↔ source, both directions |
| `size` | section/segment sizes | Info, Sections and Segments views |
| `otool` (macOS) / `dumpbin` (Windows) | the Mach-O / PE counterparts of the above | a single tool across ELF, Mach-O and PE |
| `dyld_info` (macOS) | inspect a Mach-O's dyld metadata: bind/rebase & chained fixups, dependent dylibs, exports | Relocs view decodes both dyld bind/rebase opcodes and chained fixups into a neutral table (`-o relocs`); Libs view lists dependent dylibs, including the re-export/weak/upward variants |
| `dyld_shared_cache_util` (macOS) | list / extract dylibs from the dyld shared cache | opens a cache-resident system dylib straight from the Libs view (`o`), un-sharing it into a standalone, browsable Mach-O — no separate extraction step |
| `dyld_usage` (macOS) | live-trace a process's dyld / shared-cache activity | exex resolves the shared cache *statically*: it follows a macOS binary's imports through the cache (e.g. libSystem → libsystem_kernel) to surface the transitive syscall surface — `-o syscalls-full` — without running the program |

In one line: those tools each answer one question, print, and exit; exex answers
all of them in one place, lets you **navigate** between them (follow a call into
Expand Down Expand Up @@ -277,6 +330,30 @@ it's the fast first look: open any ELF/Mach-O/PE, read its layout and code, foll
references and source mappings interactively, and drop to plain text when you need
to script.

## Architecture

For contributors: [`docs/architecture.md`](docs/architecture.md) describes the
package layering (core `binfile`/`disasm`, domain services, the two frontends),
the TUI's view contract (`view.Context` / `view.Host`) and the rendering &
performance conventions, with diagrams.

## Acknowledgements

exex builds on the work of the Go toolchain and standard library authors, plus
the authors and maintainers of these projects:

- [Bubble Tea](https://github.com/charmbracelet/bubbletea), [Bubbles](https://github.com/charmbracelet/bubbles) and [Lip Gloss](https://github.com/charmbracelet/lipgloss) for the terminal UI foundation.
- [Chroma](https://github.com/alecthomas/chroma) for full-build syntax highlighting.
- [`golang.org/x/arch`](https://pkg.go.dev/golang.org/x/arch) and [`golang.org/x/sys`](https://pkg.go.dev/golang.org/x/sys) for architecture decoders and system interfaces.
- [`github.com/ianlancetaylor/demangle`](https://pkg.go.dev/github.com/ianlancetaylor/demangle) for C++/Rust symbol demangling.
- [`github.com/atotto/clipboard`](https://github.com/atotto/clipboard) for clipboard integration.
- [`gopkg.in/yaml.v3`](https://pkg.go.dev/gopkg.in/yaml.v3) for configuration parsing.

See [`go.mod`](go.mod) for the full dependency list, including transitive
packages.

ChatGPT was used as a development and documentation assistant.

## Acknowledgements

exex builds on the work of the Go toolchain and standard library authors, plus
Expand Down
Loading
Loading