{"id":14358425,"url":"https://github.com/boricj/ghidra-delinker-extension","last_synced_at":"2026-04-26T12:01:39.417Z","repository":{"id":189017056,"uuid":"679810111","full_name":"boricj/ghidra-delinker-extension","owner":"boricj","description":"Ghidra extension for exporting relocatable object files","archived":false,"fork":false,"pushed_at":"2026-04-15T20:09:25.000Z","size":44900,"stargazers_count":586,"open_issues_count":3,"forks_count":28,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-04-15T22:12:11.631Z","etag":null,"topics":["delinking","ghidra","ghidra-extension","reverse-engineering"],"latest_commit_sha":null,"homepage":"","language":"Java","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/boricj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-08-17T17:09:20.000Z","updated_at":"2026-04-13T14:25:59.000Z","dependencies_parsed_at":"2023-11-16T19:56:11.297Z","dependency_job_id":"f366998b-ad94-4144-9997-4c21d65f0658","html_url":"https://github.com/boricj/ghidra-delinker-extension","commit_stats":null,"previous_names":["boricj/ghidra-unlinker-extension","boricj/ghidra-delinker-extension"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/boricj/ghidra-delinker-extension","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boricj%2Fghidra-delinker-extension","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boricj%2Fghidra-delinker-extension/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boricj%2Fghidra-delinker-extension/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boricj%2Fghidra-delinker-extension/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boricj","download_url":"https://codeload.github.com/boricj/ghidra-delinker-extension/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boricj%2Fghidra-delinker-extension/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32296259,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["delinking","ghidra","ghidra-extension","reverse-engineering"],"created_at":"2024-08-27T12:01:35.436Z","updated_at":"2026-04-26T12:01:39.399Z","avatar_url":"https://github.com/boricj.png","language":"Java","funding_links":[],"categories":["Java","Assembly"],"sub_categories":[],"readme":"# Object file exporter extension for Ghidra\n\nThis Ghidra extension enables exporting parts of a program as object files. These object files have valid metadata (symbols, relocation tables…) and as such can be reused directly by a toolchain for further processing.\n\nUse-cases include:\n\n * [Advanced binary patching](https://boricj.net/tenchu1/2024/05/31/part-11.html), by leveraging the linker to mend both original and modified parts together instead of doing this work by hand ;\n * [Software ports](https://boricj.net/atari-jaguar-sdk/2024/01/02/part-5.html), by isolating system-independent code from a program and replacing the rest ;\n * Converting [programs](https://boricj.net/atari-jaguar-sdk/2023/12/18/part-3.html) or object files from one file format to another ;\n * [Creating](https://boricj.net/tenchu1/2024/03/11/part-5.html) [libraries](https://boricj.net/tenchu1/2024/03/18/part-6.html), by extracting parts of a program and reusing them in another context ;\n * Decompilation projects, by splitting a program into multiple object files and reimplementing these _Ship of Theseus_-style ;\n * …\n\nMatrix of supported instruction set architectures and object files:\n\n|               | x86  | x86_64 | MIPS |\n| ------------- | ---- | ------ | ---- |\n| COFF          | ✅ | ✅ | ❌ |\n| ELF           | ✅ | ✅ | ✅ |\n\n## Building (CLI)\n\n * Clone this repository ;\n * Define the `GHIDRA_INSTALL_DIR` environment variable to point to your Ghidra installation directory ;\n * Run `gradle buildExtension`.\n\nThe Ghidra extension archive will be created inside the `dist/` directory.\n\n\u003e [!NOTE]\n\u003e GitHub Maven repositories require\tauthentication to download packages, you must either:\n\u003e\n\u003e * Create a GitHub classic token with the `read:packages` right, then add `githubToken=ghp_xxx` to `${GRADLE_USER_HOME}/gradle.properties` (usually defaults to `~/.gradle/gradle.properties`).\n\u003e * Run `gradle installStandaloneDeps` to build and install vendored dependencies from submodules.\n\n## Installation\n\n * Download the extension from the [releases page](https://github.com/boricj/ghidra-delinker-extension/releases) or build it locally ;\n * Install the extension in your Ghidra instance with **File \u003e Install Extensions…** ;\n * Enable the **RelocationTableSynthesizedPlugin** plugin with **File \u003e Configure \u003e Experimental** inside a CodeBrowser window.\n\n## Usage \n\n 1. Select a set of addresses in the Listing view to extract ;\n 2. Run the **Relocation table synthesizer** analyzer (available in one-shot mode) ;\n 3. Invoke a relocatable object file exporter with **File \u003e Export Program…**\n\nThe reconstructed relocations can be viewed with **Window \u003e Relocation table (synthesized)**.\nDetailed evaluation reports can be enabled by setting the **Evaluation report policy** option for the **Relocation table synthesizer** analyzer in the **Analysis \u003e Auto Analyze...** dialog.\n\n\u003e [!TIP]\n\u003e You do not need to reverse-engineer the entire program upfront before using this extension.\n\u003e In general, successful delinking mostly depends on the following metadata inside of the subset you're exporting (and its external references):\n\u003e * functions/pointers as relocation locations ;\n\u003e * symbol footprints as relocation targets ;\n\u003e * references between the two.\n\n\u003e [!WARNING]\n\u003e The relocation table synthesizer analyzer relies on the accuracy of the Ghidra database. Incorrect or missing information may lead to broken or missed relocations during the analysis.\n\n\u003e [!CAUTION]\n\u003e The object file exporters rely on the results of the relocation table synthesizer analyzer.\n\u003e When in doubt, run this analyzer right before exporting an object file to make sure the relocation table contents are up-to-date.\n\n## How does it work?\n\nObject files are made of three parts:\n * Relocatable section bytes ;\n * A symbol table ;\n * A relocation table.\n\nWhen a linker is invoked to generate an executable from a bunch of object files, it will:\n * Lay out their sections in memory ;\n * Compute the addresses of the symbols in the virtual address space ;\n * Apply the relocations based on the final addresses of the symbols onto the section bytes.\n\nNormally, the relocation table is discarded after this process, as well as the symbol table if debugging symbols aren't kept, leaving only the un-relocatable section bytes.\nHowever, through careful analysis this data can be recreated, which allows us to then effectively _delink_ the program back into object files.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboricj%2Fghidra-delinker-extension","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboricj%2Fghidra-delinker-extension","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboricj%2Fghidra-delinker-extension/lists"}