Skip to content

v0.1.0

Choose a tag to compare

@egonelbre egonelbre released this 31 Jul 05:24

ixdiff compares the assembly of two binaries to show how the generated
code differs: which functions changed, by how much, and what the
instruction-level differences are.

First release.

Highlights

  • Summary report: function counts, text size delta, opcode histogram,
    per-package rollup, and top-N tables (--top, --sort, --filter).
  • Per-function assembly diffs (--fn, repeatable, substring matching
    with suggestions), unified or two-column (--side-by-side), with
    hunks, address columns, and changed-operand emphasis on terminals.
  • Relocation-aware: functions whose bytes differ only because code or
    data moved are counted separately and excluded from statistics; on
    amd64 and arm64 most are classified without disassembly, so large
    binaries compare in well under a second per 100MB.
  • Normalization keeps diffs meaningful: call targets symbolized,
    branch labels alignment-derived, address-valued operands masked,
    renamed functions re-paired. Real immediates, registers, and stack
    offsets still diff (--mask-sp to ignore frame-size shifts).
  • --blocks matches basic blocks first, tolerating block reordering
    (e.g. PGO builds).
  • --json for machine-readable reports.

Pure Go (debug/elf, debug/macho, debug/pe, golang.org/x/arch),
no objdump needed. ELF, Mach-O, and PE on amd64 and arm64; Go binaries
get exact function ranges from the pclntab even when stripped.

Install

go install github.com/loov/ixdiff@v0.1.0

or use the attached prebuilt binaries for linux, macOS, and Windows.