8000 ghidra/DevGuide.md at clone-fid-namespace-stripping-exp · coderabbit-test/ghidra · GitHub
[go: up one dir, main page]

Skip to content
< 8000 script type="application/json" data-target="react-app.embeddedData">{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"GPL","path":"GPL","contentType":"directory"},{"name":"Ghidra","path":"Ghidra","contentType":"directory"},{"name":"GhidraBuild","path":"GhidraBuild","contentType":"directory"},{"name":"GhidraDocs","path":"GhidraDocs","contentType":"directory"},{"name":"eclipse","path":"eclipse","contentType":"directory"},{"name":"gradle","path":"gradle","contentType":"directory"},{"name":"licenses","path":"licenses","contentType":"directory"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"DISCLAIMER.md","path":"DISCLAIMER.md","contentType":"file"},{"name":"DevGuide.md","path":"DevGuide.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"NOTICE","path":"NOTICE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"build.gradle","path":"build.gradle","contentType":"file"},{"name":"certification.local.manifest","path":"certification.local.manifest","contentType":"file"},{"name":"gradle.properties","path":"gradle.properties","contentType":"file"},{"name":"gradlew","path":"gradlew","contentType":"file"},{"name":"gradlew.bat","path":"gradlew.bat","contentType":"file"},{"name":"settings.gradle","path":"settings.gradle","contentType":"file"}],"totalCount":22}},"fileTreeProcessingTime":9.681723999999999,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":969889509,"defaultBranch":"master","name":"ghidra","ownerLogin":"coderabbit-test","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2025-04-21T05:24:50.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/196302493?v=4","public":true,"private":false,"isOrgOwned":true},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"clone-fid-namespace-stripping-exp","listCacheKey":"v0:1745671296.0","canEdit":false,"refType":"branch","currentOid":"de7cdaeb7d265ce84acc4211653ebb51fcc2c338"},"path":"DevGuide.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/coderabbit-test/ghidra/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"DevGuide.md","displayUrl":"https://github.com/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/DevGuide.md?raw=true","headerInfo":{"blobSize":"17.4 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"cb2ca9d","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fcoderabbit-test%2Fghidra%2Fblob%2Fclone-fid-namespace-stripping-exp%2FDevGuide.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"Developer's Guide","anchor":"developers-guide","htmlText":"Developer's Guide"},{"level":2,"text":"Environment","anchor":"environment","htmlText":"Environment"},{"level":2,"text":"Quickstart","anchor":"quickstart","htmlText":"Quickstart"},{"level":2,"text":"Licensing and Copyright","anchor":"licensing-and-copyright","htmlText":"Licensing and Copyright"},{"level":2,"text":"Common Gradle Tasks","anchor":"common-gradle-tasks","htmlText":"Common Gradle Tasks"},{"level":2,"text":"Known Issues","anchor":"known-issues","htmlText":"Known Issues"},{"level":2,"text":"Offline Development Environment","anchor":"offline-development-environment","htmlText":"Offline Development Environment"},{"level":2,"text":"Developing GhidraDev Eclipse Plugin","anchor":"developing-ghidradev-eclipse-plugin","htmlText":"Developing GhidraDev Eclipse Plugin"},{"level":2,"text":"Running tests","anchor":"running-tests","htmlText":"Running tests"},{"level":2,"text":"Setup build in CI","anchor":"setup-build-in-ci","htmlText":"Setup build in CI"},{"level":2,"text":"Building Supporting Data","anchor":"building-supporting-data","htmlText":"Building Supporting Data"},{"level":3,"text":"Building Data Type Archives","anchor":"building-data-type-archives","htmlText":"Building Data Type Archives"},{"level":3,"text":"Building FID Databases","anchor":"building-fid-databases","htmlText":"Building FID Databases"},{"level":2,"text":"Debugger Development","anchor":"debugger-development","htmlText":"Debugger Development"},{"level":3,"text":"Additional Dependencies","anchor":"additional-dependencies","htmlText":"Additional Dependencies"},{"level":3,"text":"Architecture Overview","anchor":"architecture-overview","htmlText":"Architecture Overview"},{"level":3,"text":"Developing a new connector","anchor":"developing-a-new-connector","htmlText":"Developing a new connector"},{"level":3,"text":"Adding a new platform","anchor":"adding-a-new-platform","htmlText":"Adding a new platform"},{"level":3,"text":"Emulation","anchor":"emulation","htmlText":"Emulation"},{"level":3,"text":"Contributing","anchor":"contributing","htmlText":"Contributing"}],"lineInfo":{"truncatedLoc":"355","truncatedSloc":"281"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/DevGuide.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/coderabbit-test/ghidra/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/coderabbit-test/ghidra/raw/refs/heads/clone-fid-namespace-stripping-exp/DevGuide.md","renderImageOrRaw":false,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDeveloper's Guide\u003c/h1\u003e\u003ca id=\"user-content-developers-guide\" class=\"anchor\" aria-label=\"Permalink: Developer's Guide\" href=\"#developers-guide\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEnvironment\u003c/h2\u003e\u003ca id=\"user-content-environment\" class=\"anchor\" aria-label=\"Permalink: Environment\" href=\"#environment\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePrimary Language: \u003ca href=\"https://dev.java\" rel=\"nofollow\"\u003eJava\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSecondary Languages: \u003ca href=\"https://isocpp.org\" rel=\"nofollow\"\u003eC++\u003c/a\u003e, \u003ca href=\"https://htmlpreview.github.io/?https://github.com/NationalSecurityAgency/ghidra/blob/master/GhidraDocs/languages/index.html\" rel=\"nofollow\"\u003eSleigh\u003c/a\u003e, \u003ca href=\"https://www.jython.org\" rel=\"nofollow\"\u003eJython\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIntegrated Development Environment: \u003ca href=\"https://www.eclipse.org/downloads/\" rel=\"nofollow\"\u003eEclipse\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBuild System: \u003ca href=\"https://gradle.org\" rel=\"nofollow\"\u003eGradle\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSource Control: \u003ca href=\"https://git-scm.com\" rel=\"nofollow\"\u003eGit\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor specific information on required versions and download links please see the\n\u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/README.md\"\u003eREADME.md\u003c/a\u003e file.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eQuickstart\u003c/h2\u003e\u003ca id=\"user-content-quickstart\" class=\"anchor\" aria-label=\"Permalink: Quickstart\" href=\"#quickstart\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFollow the \u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/README.md#advanced-development\"\u003eAdvanced Development\u003c/a\u003e instructions in the \u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/README.md\"\u003e\nREADME.md\u003c/a\u003e file to get your development environment setup quickly.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicensing and Copyright\u003c/h2\u003e\u003ca id=\"user-content-licensing-and-copyright\" class=\"anchor\" aria-label=\"Permalink: Licensing and Copyright\" href=\"#licensing-and-copyright\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePrimary License: \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0\" rel=\"nofollow\"\u003eApache License 2.0\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSecondary Licenses: \u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/licenses\"\u003eSee licenses directory\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIf possible please try to stick to the \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0\" rel=\"nofollow\"\u003eApache License 2.0\u003c/a\u003e\nlicense when developing for Ghidra. At times it may be necessary to incorporate other compatible\nlicenses into Ghidra. Any GPL code must live in the top-level \u003ccode\u003eGPL/\u003c/code\u003e directory as a totally\nstandalone, independently buildable Ghidra module.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you are contributing code to the Ghidra project, the preferred way to receive credit/recognition\nis Git commit authorship. Please ensure your Git credentials are properly linked to your GitHub\naccount so you appear as a Ghidra contributor on GitHub. We do not have a standard for putting\nauthors' names directly in the source code, so it is discouraged.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommon Gradle Tasks\u003c/h2\u003e\u003ca id=\"user-content-common-gradle-tasks\" class=\"anchor\" aria-label=\"Permalink: Common Gradle Tasks\" href=\"#common-gradle-tasks\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDownload non-Maven Central dependencies. This creates a \u003ccode\u003edependencies\u003c/code\u003e directory in the repository\nroot.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle -I gradle/support/fetchDependencies.gradle\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle -I gradle/support/fetchDependencies.gradle\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDownload Maven Central dependencies and setup the repository for development. By default, these\nwill be stored at \u003ccode\u003e$HOME/.gradle/\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle prepdev\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle prepdev\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eGenerate nested Eclipse project files which can then be imported into Eclipse as \"existing\nprojects\".\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle cleanEclipse eclipse\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle cleanEclipse eclipse\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild native components for your current platform. Requires native tool chains to be present.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle buildNatives\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle buildNatives\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eManually compile sleigh files. Ghidra will also do this at runtime when necessary.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle sleighCompile\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle sleighCompile\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild Javadoc:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle createJavadocs\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle createJavadocs\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild Python3 packages for the Debugger:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle buildPyPackage\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle buildPyPackage\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild Ghidra to \u003ccode\u003ebuild/dist\u003c/code\u003e in an uncompressed form. This will be a distribution intended only to\nrun on the platform on which it was built.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle assembleAll\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle assembleAll\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild Ghidra to \u003ccode\u003ebuild/dist\u003c/code\u003e in a compressed form. This will be a distribution intended only to run\non the platform on which it was built.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle buildGhidra\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle buildGhidra\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eTip:\u003c/strong\u003e You may want to skip certain Gradle tasks to speed up your build, or to deal with\na problem later. For example, perhaps you added some new source files and the build is failing\nbecause of unresolved IP header issues. You can use the Gradle \u003ccode\u003e-x \u0026lt;task\u0026gt;\u003c/code\u003e command line argument to\nprevent specific tasks from running:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle buildGhidra -x ip\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle buildGhidra -x ip\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKnown Issues\u003c/h2\u003e\u003ca id=\"user-content-known-issues\" class=\"anchor\" aria-label=\"Permalink: Known Issues\" href=\"#known-issues\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eThere is a known issue in Gradle that can prevent it from discovering native toolchains on Linux\nif a non-English system locale is being used. As a workaround, set the following environment\nvariable prior to running your Gradle task: \u003ccode\u003eLC_MESSAGES=en_US.UTF-8\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOffline Development Environment\u003c/h2\u003e\u003ca id=\"user-content-offline-development-environment\" class=\"anchor\" aria-label=\"Permalink: Offline Development Environment\" href=\"#offline-development-environment\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSometimes you may want to move the Ghidra repository to an offline network and do development there.\nThese are the recommended steps to ensure that you not only move the source repository, but all\ndownloaded dependencies as well:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003egradle -I gradle/support/fetchDependencies.gradle\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egradle -g dependencies/gradle prepdev\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMove ghidra directory to different system\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egradle -g dependencies/gradle buildGhidra\u003c/code\u003e (on offline system)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNOTE\u003c/strong\u003e: The \u003ccode\u003e-g\u003c/code\u003e flag specifies the Gradle user home directory. The default is the \u003ccode\u003e.gradle\u003c/code\u003e\ndirectory in the user’s home directory. Overriding it to be inside the Ghidra repository will\nensure that all maven central dependencies that were fetched during the \u003ccode\u003eprepdev\u003c/code\u003e task will be moved\nalong with the rest of the repo.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDeveloping GhidraDev Eclipse Plugin\u003c/h2\u003e\u003ca id=\"user-content-developing-ghidradev-eclipse-plugin\" class=\"anchor\" aria-label=\"Permalink: Developing GhidraDev Eclipse Plugin\" href=\"#developing-ghidradev-eclipse-plugin\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDeveloping the GhidraDev Eclipse plugin requires the\n\u003cem\u003eEclipse PDE (Plug-in Development Environment)\u003c/em\u003e, which can be installed via the Eclipse marketplace.\nIt is also included in the \u003cem\u003eEclipse IDE for RCP and RAP Developers\u003c/em\u003e. To generate the GhidraDev\nEclipse projects, execute:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle eclipse -PeclipsePDE\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle eclipse -PeclipsePDE\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eImport the newly generated GhidraDev projects into an Eclipse that supports this type of project.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote:\u003c/strong\u003e If you are getting compilation errors related to PyDev and CDT, go into Eclipse's\npreferences, and under \u003cem\u003eTarget Platform\u003c/em\u003e, activate \u003cem\u003e/Eclipse GhidraDevPlugin/GhidraDev.target\u003c/em\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/README.md#building\"\u003eBuilding GhidraDev\u003c/a\u003e\nfor instructions on how to build the GhidraDev plugin.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRunning tests\u003c/h2\u003e\u003ca id=\"user-content-running-tests\" class=\"anchor\" aria-label=\"Permalink: Running tests\" href=\"#running-tests\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo run unit tests, do:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle unitTestReport\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle unitTestReport\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor more complex integration tests, do:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle integrationTest\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle integrationTest\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor running both unit and integration tests and to generate a report do:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle combinedTestReport\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle combinedTestReport\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup build in CI\u003c/h2\u003e\u003ca id=\"user-content-setup-build-in-ci\" class=\"anchor\" aria-label=\"Permalink: Setup build in CI\" href=\"#setup-build-in-ci\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor running tests in headless mode on Linux, in a CI environment, or in Docker, first do:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Xvfb :99 -nolisten tcp \u0026amp;\nexport DISPLAY=:99\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eXvfb :99 -nolisten tcp \u0026amp;\nexport DISPLAY=:99\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis is required to make AWT happy.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding Supporting Data\u003c/h2\u003e\u003ca id=\"user-content-building-supporting-data\" class=\"anchor\" aria-label=\"Permalink: Building Supporting Data\" href=\"#building-supporting-data\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSome features of Ghidra require the curation of rather extensive databases. These include the Data\nType Archives and Function ID Databases, both of which require collecting header files and libraries\nfor the relevant SDKs and platforms. Much of this work is done by hand. The archives included in our\nofficial builds can be found in the \u003ca href=\"https://github.com/NationalSecurityAgency/ghidra-data\"\u003eghidra-data\u003c/a\u003e repository.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding Data Type Archives\u003c/h3\u003e\u003ca id=\"user-content-building-data-type-archives\" class=\"anchor\" aria-label=\"Permalink: Building Data Type Archives\" href=\"#building-data-type-archives\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis task is often done manually from the Ghidra GUI, and the archives included in our official\nbuild require a fair bit of fine tuning.\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eFrom the CodeBrowser, select \u003cstrong\u003eFile -\u0026gt; Parse C Source\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eFrom here you can create and configure\nparsing profiles, which lists headers and pre-processor options.\u003c/li\u003e\n\u003cli\u003eClick \u003cem\u003eParse to File\u003c/em\u003e to create the Data Type Archive.\u003c/li\u003e\n\u003cli\u003eThe result can be added to an installation or source tree by copying it to\n\u003ccode\u003eGhidra/Features/Base/data/typeinfo\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding FID Databases\u003c/h3\u003e\u003ca id=\"user-content-building-fid-databases\" class=\"anchor\" aria-label=\"Permalink: Building FID A201 Databases\" href=\"#building-fid-databases\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis task is often done manually from the Ghidra GUI, and the archives included in our official\nbuild require a fair bit of fine tuning. You will first need to import the relevant libraries from\nwhich you'd like to produce a FID database. This is often a set of libraries from an SDK. We include\na variety of Visual Studio platforms in the official build. The official .fidb files can be found in\nthe \u003ca href=\"https://github.com/NationalSecurityAgency/ghidra-data\"\u003eghidra-data\u003c/a\u003e repository.\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eFrom the CodeBrowser, select \u003cstrong\u003eFile -\u0026gt; Configure\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEnable the \"Function ID\" plugins, and close the dialog.\u003c/li\u003e\n\u003cli\u003eFrom the CodeBrowser, select \u003cstrong\u003eTools -\u0026gt; Function ID -\u0026gt; Create new empty FidDb\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eChoose a destination file.\u003c/li\u003e\n\u003cli\u003eSelect \u003cstrong\u003eTools -\u0026gt; Function ID -\u0026gt; Populate FidDb\u003c/strong\u003e from programs.\u003c/li\u003e\n\u003cli\u003eFill out the options appropriately and click OK.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eIf you'd like some details of our fine tuning, take a look at \u003ca href=\"/coderabbit-test/ghidra/blob/clone-fid-namespace-stripping-exp/Ghidra/Features/FunctionID/data/building_fid.txt\"\u003ebuilding_fid.txt\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDebugger Development\u003c/h2\u003e\u003ca id=\"user-content-debugger-development\" class=\"anchor\" aria-label=\"Permalink: Debugger Development\" href=\"#debugger-development\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe have recently changed the Debugger's back-end architecture.\nWe no longer user JNA to access native Debugger APIs.\nWe only use it for pseudo-terminal access.\nInstead, we use Python3 and a protobuf-based TCP connection for back-end integration.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdditional Dependencies\u003c/h3\u003e\u003ca id=\"user-content-additional-dependencies\" class=\"anchor\" aria-label=\"Permalink: Additional Dependencies\" href=\"#additional-dependencies\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn addition to Ghidra's normal dependencies, you may want the following:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWinDbg for Windows x64\u003c/li\u003e\n\u003cli\u003eGDB 13 or later for Linux\u003c/li\u003e\n\u003cli\u003eLLDB 10 or later for macOS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe others (e.g., JNA) are handled by Gradle via Maven Central.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eArchitecture Overview\u003c/h3\u003e\u003ca id=\"user-content-architecture-overview\" class=\"anchor\" aria-label=\"Permalink: Architecture Overview\" href=\"#architecture-overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThere are several Eclipse projects each fitting into a larger architectural picture.\nThese all currently reside in the \u003ccode\u003eGhidra/Debug\u003c/code\u003e directory, but will likely be re-factored into the\n\u003ccode\u003eFramework\u003c/code\u003e and \u003ccode\u003eFeature\u003c/code\u003e directories later. Each project is listed \"bottom up\" with a brief\ndescription and status.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eProposedUtils - a collection of utilities proposed to be moved to other respective projects.\u003c/li\u003e\n\u003cli\u003eAnnotationValidator - an experimental annotation processor for database access objects.\u003c/li\u003e\n\u003cli\u003eFramework-TraceModeling - a database schema and set of interfaces for storing machine state over\ntime.\u003c/li\u003e\n\u003cli\u003eFramework-AsyncComm - a collection of utilities for asynchronous communication (packet formats\nand completable-future conveniences).\u003c/li\u003e\n\u003cli\u003eFramework-Debugging - specifies interfaces for debugger models and provides implementation\nconveniences. This is mostly deprecated.\u003c/li\u003e\n\u003cli\u003eDebugger - the collection of Ghidra plugins and services comprising the Debugger UI.\u003c/li\u003e\n\u003cli\u003eDebugger-rmi-trace - the wire protocol, client, services, and UI components for Trace RMI, the new back-end architecture.\u003c/li\u003e\n\u003cli\u003eDebugger-agent-dbgeng - the connector for WinDbg (via dbgeng.dll) on Windows x64.\u003c/li\u003e\n\u003cli\u003eDebugger-agent-dbgmodel - an experimental connector for WinDbg Preview (with TTD, via\ndbgmodel.dll) on Windows x64. This is deprecated, as most of these features are implemented in Debugger-agent-dbgeng for the new architecture.\u003c/li\u003e\n\u003cli\u003eDebugger-agent-dbgmodel-traceloader - an experimental \"importer\" for WinDbg trace files. This is deprecated.\u003c/li\u003e\n\u003cli\u003eDebugger-agent-gdb - the connector for GDB (13 or later recommended) on UNIX.\u003c/li\u003e\n\u003cli\u003eDebugger-swig-lldb - the Java language bindings for LLDB's SBDebugger, also proposed upstream. This is deprecated. We now use the Python3 language bindings for LLDB.\u003c/li\u003e\n\u003cli\u003eDebugger-agent-lldb - the connector for LLDB (10 or later recommended) on macOS, UNIX, and Windows.\u003c/li\u003e\n\u003cli\u003eDebugger-gadp - the connector for our custom wire protocol the Ghidra Asynchronous Debugging\nProtocol. This is deprecated. It's replaced by Debugger-rmi-trace.\u003c/li\u003e\n\u003cli\u003eDebugger-jpda - an in-development connector for Java and Dalvik debugging via JDI (i.e., JDWP). This is deprecated and not yet replaced.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe Trace Modeling schema records machine state and markup over time.\nIt rests on the same database framework as Programs, allowing trace recordings to be stored in a Ghidra project and shared via a server, if desired.\nTrace \"recording\" is a de facto requirement for displaying information in Ghidra's UI.\nThe back-end connector has full discretion over what is recorded by using Trace RMI.\nTypically, only the machine state actually observed by the user (or perhaps a script) is recorded.\nFor most use cases, the Trace is small and ephemeral, serving only to mediate between the UI components and the target's model.\nIt supports many of the same markup (e.g., disassembly, data types) as Programs, in addition to tracking active threads, loaded modues, breakpoints, etc.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEvery back end (or \"adapter\" or \"connector\" or \"agent\") employs the Trace RMI client to populate a trace database.\nAs a general rule in Ghidra, no component is allowed to access a native API and reside in the same JVM as the Ghidra UI.\nThis allows us to contain crashes, preventing data loss.\nTo accommodate this requirement — given that debugging native applications is almost certainly going to require access to native APIs — we've developed the Trace RMI protocol.\nThis also allows us to better bridge the language gap between Java and Python, which is supported by most native debuggers.\nThis protocol is loosely coupled to Framework-TraceModeling, essentially exposing its methods via RMI, as well as some methods for controlling the UI.\nThe protocol is built using Google's Protobuf library, providing a potential path for back-end implementations in alternative languages.\nWe provide the Trace RMI server as a Ghidra component implemented in Java and the Trace RMI client as a Python3 package.\nA back-end implementation may be a stand-alone executable or script that accesses the native debugger's API, or a script or plugin for the native debugger.\nIt then connects to Ghidra via Trace RMI to populate the trace database with information gleaned from that API.\nIt should provide a set of diagnostic commands to control and monitor that connection.\nIt should also use the native API to detect session and target changes so that Ghidra's UI consistently reflects the debugging session.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe old system relied on a \"recorder\" to discover targets and map them to traces in the proper Ghidra language.\nThat responsibility is now delegated to the back end.\nTypically, it examines the target's architecture and immediately creates a trace upon connection.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDeveloping a new connector\u003c/h3\u003e\u003ca id=\"user-content-developing-a-new-connector\" class=\"anchor\" aria-label=\"Permalink: Developing a new connector\" href=\"#developing-a-new-connector\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSo Ghidra does not yet support your favorite debugger?\nWe believe the new system is much less daunting than the previous.\nStill, please finish reading this guide, and look carefully at the ones we have so far, and perhaps ask to see if we are already developing one.\nOf course, in time you might also search the internet to see if others are developing one.\nThere are quite a few caveats and gotchas, the most notable being that this interface is still in some flux.\nWhen things go wrong, it could be because of, without limitation:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eA bug on your part\u003c/li\u003e\n\u003cli\u003eA bug on our part\u003c/li\u003e\n\u003cli\u003eA design flaw in the interfaces\u003c/li\u003e\n\u003cli\u003eA bug in the debugger/API you're adapting\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eWe are still (yes, still) in the process of writing up this documentation.\nIn the meantime, we recommend using the GDB and dbgeng agents as examples.\nBe sure to look at the Python code \u003ccode\u003esrc/main/py\u003c/code\u003e!\nThe deprecated Java code \u003ccode\u003esrc/main/java\u003c/code\u003e is still included as we transition.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou'll also need to provide launcher(s) so that Ghidra knows how to configure and start your connector.\nThese are just shell scripts.\nWe use bash scripts on Linux and macOS, and we use batch files on Windows.\nTry to include as many common use cases as makes sense for the debugger.\nThis provides the most flexibility to users and examples to power users who might create derivative launchers.\nLook at the existing launchers for examples.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor testing, please follow the examples for GDB.\nWe no longer provide abstract classes that prescribe requirements.\nInstead, we just provide GDB as an example.\nUsually, we split our tests into three categories:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCommands\u003c/li\u003e\n\u003cli\u003eMethods\u003c/li\u003e\n\u003cli\u003eHooks\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe Commands tests check that the user CLI commands, conventionally implemented in \u003ccode\u003ecommands.py\u003c/code\u003e, work correctly.\nIn general, do the minimum connection setup, execute the command, and check that it produces the expected output and causes the expected effects.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe Methods tests check that the remote methods, conventionally implemented in \u003ccode\u003emethods.py\u003c/code\u003e, work correctly.\nMany methods are just wrappers around CLI commands, some provided by the native debugger and some provided by \u003ccode\u003ecommands.py\u003c/code\u003e.\nThese work similarly to the commands test, except that they invoke methods instead of executing commands.\nAgain, check the return value (rarely applicable) and that it causes the expected effects.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe Hooks tests check that the back end is able to listen for session and target changes, e.g., knowing when the target stops.\n\u003cem\u003eThe test should not \"cheat\" by executing commands or invoking methods that should instead be triggered by the listener.\u003c/em\u003e\nIt should execute the minimal commands to setup the test, then trigger an event.\nIt should then check that the event in turn triggered the expected effects, e.g., updating PC upon the target stopping.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhenever you make a change to the Python code, you'll need to re-assemble the package's source.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"gradle assemblePyPackage\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egradle assemblePyPackage\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis is required in case your package includes generated source, as is the case for Debugger-rmi-trace.\nIf you want to create a new Ghidra module for your connector (recommended) use an existing one's \u003ccode\u003ebuild.gradle\u003c/code\u003e as a template.\nA key part is applying the \u003ccode\u003ehasPythonPackage.gradle\u003c/code\u003e script.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdding a new platform\u003c/h3\u003e\u003ca id=\"user-content-adding-a-new-platform\" class=\"anchor\" aria-label=\"Permalink: Adding a new platform\" href=\"#adding-a-new-platform\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf a connector already exists for a suitable debugger on the desired platform, then adding it may be very simple.\nFor example, many platforms are supported by GDB, so even though we're currently focused on x86-64 (and to some extent arm64) support, we've provided the mappings for many.\nThese mappings are conventionally kept in each connector's \u003ccode\u003earch.py\u003c/code\u003e file.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn general, to update \u003ccode\u003earch.py\u003c/code\u003e, you need to know:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eWhat the platform is called (including variant names) by the debugger\u003c/li\u003e\n\u003cli\u003eWhat the processor language is called by Ghidra\u003c/li\u003e\n\u003cli\u003eIf applicable, the mapping of target address spaces into Ghidra's address spaces\u003c/li\u003e\n\u003cli\u003eIf applicable, the mapping of target register names to those in Ghidra's processor language\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eIn most cases (3) and (4) are already implemented by the included mappers.\nNaturally, you'll want to test the special cases, preferably in automated tests.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEmulation\u003c/h3\u003e\u003ca id=\"user-content-emulation\" class=\"anchor\" aria-label=\"Permalink: Emulation\" href=\"#emulation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe most obvious integration path for 3rd-party emulators is to write a \"connector.\"\nHowever, p-code emulation is an integral feature of the Ghidra UI, and it has a fairly accessible API.\nNamely, for interpolation between machines states recorded in a trace, and extrapolation into future machine states.\nIntegration of such emulators may still be useful to you, but we recommend trying the p-code emulator to see if it suits your needs for emulation in Ghidra before pursuing integration of another emulator.\nWe also provide out-of-the-box QEMU integration via GDB.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing\u003c/h3\u003e\u003ca id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen submitting help tickets and pull requests, please tag those related to the debugger with \"Debugger\" so that we can triage them more quickly.\u003c/p\u003e\n\u003c/article\u003e","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Developer's Guide","kind":"section_1","ident_start":2,"ident_end":19,"extent_start":0,"extent_end":17791,"fully_qualified_name":"Developer's Guide","ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":19}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":355,"utf16_col":0}}},{"name":"Environment","kind":"section_2","ident_start":24,"ident_end":35,"extent_start":21,"extent_end":370,"fully_qualified_name":"Environment","ident_utf16":{"start":{"line_number":2,"utf16_col":3},"end":{"line_number":2,"utf16_col":14}},"extent_utf16":{"start":{"line_number":2,"utf16_col":0},"end":{"line_number":12,"utf16_col":0}}},{"name":"Quickstart","kind":"section_2","ident_start":373,"ident_end":383,"extent_start":370,"extent_end":552,"fully_qualified_name":"Quickstart","ident_utf16":{"start":{"line_number":12,"utf16_col":3},"end":{"line_number":12,"utf16_col":13}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":16,"utf16_col":0}}},{"name":"Licensing and Copyright","kind":"section_2","ident_start":555,"ident_end":578,"extent_start":552,"extent_end":1361,"fully_qualified_name":"Licensing and Copyright","ident_utf16":{"start":{"line_number":16,"utf16_col":3},"end":{"line_number":16,"utf16_col":26}},"extent_utf16":{"start":{"line_number":16,"utf16_col":0},"end":{"line_number":30,"utf16_col":0}}},{"name":"Common Gradle Tasks","kind":"section_2","ident_start":1364,"ident_end":1383,"extent_start":1361,"extent_end":2903,"fully_qualified_name":"Common Gradle Tasks","ident_utf16":{"start":{"line_number":30,"utf16_col":3},"end":{"line_number":30,"utf16_col":22}},"extent_utf16":{"start":{"line_number":30,"utf16_col":0},"end":{"line_number":89,"utf16_col":0}}},{"name":"Known Issues","kind":"section_2","ident_start":2906,"ident_end":2918,"extent_start":2903,"extent_end":3188,"fully_qualified_name":"Known Issues","ident_utf16":{"start":{"line_number":89,"utf16_col":3},"end":{"line_number":89,"utf16_col":15}},"extent_utf16":{"start":{"line_number":89,"utf16_col":0},"end":{"line_number":94,"utf16_col":0}}},{"name":"Offline Development Environment","kind":"section_2","ident_start":3191,"ident_end":3222,"extent_start":3188,"extent_end":3993,"fully_qualified_name":"Offline Development Environment","ident_utf16":{"start":{"line_number":94,"utf16_col":3},"end":{"line_number":94,"utf16_col":34}},"extent_utf16":{"start":{"line_number":94,"utf16_col":0},"end":{"line_number":109,"utf16_col":0}}},{"name":"Developing GhidraDev Eclipse Plugin","kind":"section_2","ident_start":3996,"ident_end":4031,"extent_start":3993,"extent_end":4792,"fully_qualified_name":"Developing GhidraDev Eclipse Plugin","ident_utf16":{"start":{"line_number":109,"utf16_col":3},"end":{"line_number":109,"utf16_col":38}},"extent_utf16":{"start":{"line_number":109,"utf16_col":0},"end":{"line_number":127,"utf16_col":0}}},{"name":"Running tests","kind":"section_2","ident_start":4795,"ident_end":4808,"extent_start":4792,"extent_end":5043,"fully_qualified_name":"Running tests","ident_utf16":{"start":{"line_number":127,"utf16_col":3},"end":{"line_number":127,"utf16_col":16}},"extent_utf16":{"start":{"line_number":127,"utf16_col":0},"end":{"line_number":143,"utf16_col":0}}},{"name":"Setup build in CI","kind":"section_2","ident_start":5046,"ident_end":5063,"extent_start":5043,"extent_end":5244,"fully_qualified_name":"Setup build in CI","ident_utf16":{"start":{"line_number":143,"utf16_col":3},"end":{"line_number":143,"utf16_col":20}},"extent_utf16":{"start":{"line_number":143,"utf16_col":0},"end":{"line_number":152,"utf16_col":0}}},{"name":"Building Supporting Data","kind":"section_2","ident_start":5247,"ident_end":5271,"extent_start":5244,"extent_end":7103,"fully_qualified_name":"Building Supporting Data","ident_utf16":{"start":{"line_number":152,"utf16_col":3},"end":{"line_number":152,"utf16_col":27}},"extent_utf16":{"start":{"line_number":152,"utf16_col":0},"end":{"line_number":187,"utf16_col":0}}},{"name":"Building Data Type Archives","kind":"section_3","ident_start":5642,"ident_end":5669,"extent_start":5638,"extent_end":6151,"fully_qualified_name":"Building Data Type Archives","ident_utf16":{"start":{"line_number":159,"utf16_col":4},"end":{"line_number":159,"utf16_col":31}},"extent_utf16":{"start":{"line_number":159,"utf16_col":0},"end":{"line_number":170,"utf16_col":0}}},{"name":"Building FID Databases","kind":"section_3","ident_start":6155,"ident_end":6177,"extent_start":6151,"extent_end":7103,"fully_qualified_name":"Building FID Databases","ident_utf16":{"start":{"line_number":170,"utf16_col":4},"end":{"line_number":170,"utf16_col":26}},"extent_utf16":{"start":{"line_number":170,"utf16_col":0},"end":{"line_number":187,"utf16_col":0}}},{"name":"Debugger Development","kind":"section_2","ident_start":7106,"ident_end":7126,"extent_start":7103,"extent_end":17791,"fully_qualified_name":"Debugger Development","ident_utf16":{"start":{"line_number":187,"utf16_col":3},"end":{"line_number":187,"utf16_col":23}},"extent_utf16":{"start":{"line_number":187,"utf16_col":0},"end":{"line_number":355,"utf16_col":0}}},{"name":"Additional Dependencies","kind":"section_3","ident_start":7379,"ident_end":7402,"extent_start":7375,"extent_end":7629,"fully_qualified_name":"Additional Dependencies","ident_utf16":{"start":{"line_number":194,"utf16_col":4},"end":{"line_number":194,"utf16_col":27}},"extent_utf16":{"start":{"line_number":194,"utf16_col":0},"end":{"line_number":204,"utf16_col":0}}},{"name":"Architecture Overview","kind":"section_3","ident_start":7633,"ident_end":7654,"extent_start":7629,"extent_end":12374,"fully_qualified_name":"Architecture Overview","ident_utf16":{"start":{"line_number":204,"utf16_col":4},"end":{"line_number":204,"utf16_col":25}},"extent_utf16":{"start":{"line_number":204,"utf16_col":0},"end":{"line_number":257,"utf16_col":0}}},{"name":"Developing a new connector","kind":"section_3","ident_start":12378,"ident_end":12404,"extent_start":12374,"extent_end":15594,"fully_qualified_name":"Developing a new connector","ident_utf16":{"start":{"line_number":257,"utf16_col":4},"end":{"line_number":257,"utf16_col":30}},"extent_utf16":{"start":{"line_number":257,"utf16_col":0},"end":{"line_number":315,"utf16_col":0}}},{"name":"Adding a new platform","kind":"section_3","ident_start":15598,"ident_end":15619,"extent_start":15594,"extent_end":16497,"fully_qualified_name":"Adding a new platform","ident_utf16":{"start":{"line_number":315,"utf16_col":4},"end":{"line_number":315,"utf16_col":25}},"extent_utf16":{"start":{"line_number":315,"utf16_col":0},"end":{"line_number":331,"utf16_col":0}}},{"name":"Emulation","kind":"section_3","ident_start":16501,"ident_end":16510,"extent_start":16497,"extent_end":17080,"fully_qualified_name":"Emulation","ident_utf16":{"start":{"line_number":331,"utf16_col":4},"end":{"line_number":331,"utf16_col":13}},"extent_utf16":{"start":{"line_number":331,"utf16_col":0},"end":{"line_number":339,"utf16_col":0}}},{"name":"Contributing","kind":"section_3","ident_start":17084,"ident_end":17096,"extent_start":17080,"extent_end":17791,"fully_qualified_name":"Contributing","ident_utf16":{"start":{"line_number":339,"utf16_col":4},"end":{"line_number":339,"utf16_col":16}},"extent_utf16":{"start":{"line_number":339,"utf16_col":0},"end":{"line_number":355,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"csrf_tokens":{"/coderabbit-test/ghidra/branches":{"post":"A8QB756Ji0etpvszCMdXRwia0kkTftXhTY3WQ5w9Satyt7woN5CcVd_cDIxnLSIrJ6LUgUAPjlBxhBXtIp7Wtw"},"/repos/preferences":{"post":"KfEy4BK7RekB6apG6HAsMwCb3MY7N0TyBT8417zqKSD8DEqa4yCqXXWapcVojcbfWmQxrQR-UXivtEx3i-zPoQ"}}},"title":"ghidra/DevGuide.md at clone-fid-namespace-stripping-exp · coderabbit-test/ghidra","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1b17b3e7786a.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0