{"id":13691816,"url":"https://github.com/encounter/objdiff","last_synced_at":"2026-01-30T08:10:13.736Z","repository":{"id":64471838,"uuid":"534397346","full_name":"encounter/objdiff","owner":"encounter","description":"A local diffing tool for decompilation projects","archived":false,"fork":false,"pushed_at":"2025-05-14T03:38:03.000Z","size":2028,"stargazers_count":194,"open_issues_count":46,"forks_count":26,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-14T04:52:50.284Z","etag":null,"topics":["asm","assembly","codewarrior","decompilation","disassembler","egui","gamecube","metrowerks","mips","nintendo-64","powerpc","reverse-engineering","rust","wii"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/encounter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-08T21:21:16.000Z","updated_at":"2025-05-14T03:38:07.000Z","dependencies_parsed_at":"2024-01-21T07:30:02.066Z","dependency_job_id":"ff5f136e-dd6d-4dcf-8dcf-cfe28cf5a331","html_url":"https://github.com/encounter/objdiff","commit_stats":{"total_commits":261,"total_committers":16,"mean_commits":16.3125,"dds":0.5057471264367817,"last_synced_commit":"a119d9a6dd98a9ed51edaa7c5ba3e14e5f296afa"},"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/encounter%2Fobjdiff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/encounter%2Fobjdiff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/encounter%2Fobjdiff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/encounter%2Fobjdiff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/encounter","download_url":"https://codeload.github.com/encounter/objdiff/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254422754,"owners_count":22068678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asm","assembly","codewarrior","decompilation","disassembler","egui","gamecube","metrowerks","mips","nintendo-64","powerpc","reverse-engineering","rust","wii"],"created_at":"2024-08-02T17:00:50.722Z","updated_at":"2025-12-24T03:54:43.406Z","avatar_url":"https://github.com/encounter.png","language":"Rust","readme":"# objdiff [![Build Status]][actions]\n\n[Build Status]: https://github.com/encounter/objdiff/actions/workflows/build.yaml/badge.svg\n[actions]: https://github.com/encounter/objdiff/actions\n\nA local diffing tool for decompilation projects. Inspired by [decomp.me](https://decomp.me) and [asm-differ](https://github.com/simonlindholm/asm-differ).\n\nFeatures:\n\n- Compare entire object files: functions and data\n- Built-in C++ symbol demangling (GCC, MSVC, CodeWarrior, Itanium)\n- Automatic rebuild on source file changes\n- Project integration via [configuration file](#configuration)\n- Search and filter objects with quick switching\n- Click-to-highlight values and registers\n- Detailed progress reporting (powers [decomp.dev](https://decomp.dev))\n- WebAssembly API, [web interface](https://github.com/encounter/objdiff-web) and [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=decomp-dev.objdiff) (WIP)\n\nSupports:\n\n- ARM (GBA, DS, 3DS)\n- ARM64 (Switch)\n- MIPS (N64, PS1, PS2, PSP)\n- PowerPC (GameCube, Wii, PS3, Xbox 360)\n- SuperH (Saturn, Dreamcast)\n- x86, x86_64 (PC)\n\nSee [Usage](#usage) for more information.\n\n## Downloads\n\nTo build from source, see [Building](#building).\n\n### GUI\n\n- [Windows (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-windows-x86_64.exe)\n- [Linux (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-linux-x86_64)\n- [macOS (arm64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-macos-arm64)\n- [macOS (x86_64)](https://github.com/encounter/objdiff/releases/latest/download/objdiff-macos-x86_64)\n\nFor Linux and macOS, run `chmod +x objdiff-*` to make the binary executable.\n\n### CLI\n\nCLI binaries are available on the [releases page](https://github.com/encounter/objdiff/releases).\n\n## Screenshots\n\n![Symbol Screenshot](assets/screen-symbols.png)\n![Diff Screenshot](assets/screen-diff.png)\n\n## Usage\n\nobjdiff compares two relocatable object files (`.o`). Here's how it works:\n\n1. **Create an `objdiff.json` configuration file** in your project root (or generate it with your build script).  \n  This file lists **all objects in the project** with their target (\"expected\") and base (\"current\") paths.\n\n2. **Load the project** in objdiff.\n\n3. **Select an object** from the sidebar to begin diffing.\n\n4. **objdiff automatically:**\n   - Executes the build system to compile the base object (from current source code)\n   - Compares the two objects and displays the differences\n   - Watches for source file changes and rebuilds when detected\n\nThe configuration file allows complete flexibility in project structure - your build directories can have any layout as long as the paths are specified correctly.\n\nSee [Configuration](#configuration) for setup details.\n\n## Configuration\n\nProjects can add an `objdiff.json` file to configure the tool automatically. The configuration file must be located in\nthe root project directory.\n\nIf your project has a generator script (e.g. `configure.py`), it's highly recommended to generate the objdiff configuration\nfile as well. You can then add `objdiff.json` to your `.gitignore` to prevent it from being committed.\n\n```json\n{\n  \"$schema\": \"https://raw.githubusercontent.com/encounter/objdiff/main/config.schema.json\",\n  \"custom_make\": \"ninja\",\n  \"custom_args\": [\n    \"-d\",\n    \"keeprsp\"\n  ],\n  \"build_target\": false,\n  \"build_base\": true,\n  \"watch_patterns\": [\n    \"*.c\",\n    \"*.cc\",\n    \"*.cp\",\n    \"*.cpp\",\n    \"*.cxx\",\n    \"*.c++\",\n    \"*.h\",\n    \"*.hh\",\n    \"*.hp\",\n    \"*.hpp\",\n    \"*.hxx\",\n    \"*.h++\",\n    \"*.pch\",\n    \"*.pch++\",\n    \"*.inc\",\n    \"*.s\",\n    \"*.S\",\n    \"*.asm\",\n    \"*.py\",\n    \"*.yml\",\n    \"*.txt\",\n    \"*.json\"\n  ],\n  \"ignore_patterns\": [\n    \"build/**/*\"\n  ],\n  \"units\": [\n    {\n      \"name\": \"main/MetroTRK/mslsupp\",\n      \"target_path\": \"build/asm/MetroTRK/mslsupp.o\",\n      \"base_path\": \"build/src/MetroTRK/mslsupp.o\",\n      \"metadata\": {}\n    }\n  ]\n}\n```\n\n### Schema\n\n\u003e [!NOTE]  \n\u003e View [config.schema.json](config.schema.json) for all available options. Below is a summary of the most important options.\n\n#### Build Configuration\n\n**`custom_make`** _(optional, default: `\"make\"`)_  \nIf the project uses a different build system (e.g. `ninja`), specify it here. The build command will be `[custom_make] [custom_args] path/to/object.o`.\n\n**`custom_args`** _(optional)_  \nAdditional arguments to pass to the build command prior to the object path.\n\n**`build_target`**  _(default: `false`)_  \nIf true, objdiff will build the target objects before diffing (e.g. `make path/to/target.o`). Useful if target objects are not built by default or can change based on project configuration. Requires proper build system configuration.\n\n**`build_base`**  _(default: `true`)_  \nIf true, objdiff will build the base objects before diffing (e.g. `make path/to/base.o`). It's unlikely you'll want to disable this unless using an external tool to rebuild the base object.\n\n#### File Watching\n\n**`watch_patterns`** _(optional, default: listed above)_  \nA list of glob patterns to watch for changes ([supported syntax](https://docs.rs/globset/latest/globset/#syntax)). When these files change, objdiff automatically rebuilds and re-compares objects.\n\n**`ignore_patterns`** _(optional, default: listed above)_  \nA list of glob patterns to explicitly ignore when watching for changes ([supported syntax](https://docs.rs/globset/latest/globset/#syntax)).\n\n#### Units (Objects)\n\n**`units`** _(optional)_  \nIf specified, objdiff displays a list of objects in the sidebar for easy navigation. Each unit contains:\n\n- **`name`** _(optional)_ - The display name in the UI. Defaults to the object's `path`.\n- **`target_path`** _(optional)_ - Path to the \"target\" or \"expected\" object (the **intended result**).\n- **`base_path`** _(optional)_ - Path to the \"base\" or \"current\" object (built from **current source code**). Omit if there is no source object yet.\n- **`metadata.auto_generated`** _(optional)_ - Hides the object from the sidebar but includes it in progress reports.\n- **`metadata.complete`** _(optional)_ - Marks the object as \"complete\" (linked) when `true` or \"incomplete\" when `false`.\n\n## Building\n\nInstall Rust via [rustup](https://rustup.rs).\n\n```shell\ngit clone https://github.com/encounter/objdiff.git\ncd objdiff\ncargo run --release\n```\n\nOr install directly with cargo:\n\n```shell\ncargo install --locked --git https://github.com/encounter/objdiff.git objdiff-gui objdiff-cli\n```\n\nBinaries will be installed to `~/.cargo/bin` as `objdiff` and `objdiff-cli`.\n\n## Contributing\n\nInstall `pre-commit` to run linting and formatting automatically:\n\n```shell\nrustup toolchain install nightly  # Required for cargo fmt/clippy\ncargo install --locked cargo-deny # https://github.com/EmbarkStudios/cargo-deny\nuv tool install pre-commit        # https://docs.astral.sh/uv, or use pipx or pip\npre-commit install\n```\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or \u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttp://opensource.org/licenses/MIT\u003e)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as\ndefined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.\n","funding_links":[],"categories":["Recently Updated","Libraries","Tools and Libraries","🛠️ General Tools"],"sub_categories":["[Feb 24, 2025](/content/2025/02/24/README.md)","Reverse engineering","🔬 Format Analysis \u0026 Reverse Engineering"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fencounter%2Fobjdiff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fencounter%2Fobjdiff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fencounter%2Fobjdiff/lists"}