From 22ea23e8435f982b4a81d75f25dbaad5fed3d04f Mon Sep 17 00:00:00 2001 From: Michael Pollmeier Date: Thu, 28 May 2026 16:36:25 +0200 Subject: [PATCH 1/4] ghidra 12.2 https://github.com/joernio/ghidra/actions/runs/26577956114/job/78304054748 --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 716d986047a1..fe3fc0c64739 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -17,7 +17,7 @@ object Versions { val eclipseCdt = "9.2.100.202507101054+1" val eclipseCore = "3.23.0" val eclipseText = "3.14.400" - val ghidra = "11.4_f331b5bbea-202504251242" + val ghidra = "12.2_744c5dee92-202605281342" val gradleTooling = "8.3" val jacksonDatabind = "2.17.0" val javaParser = "3.28.0" From a4c9b464241409a767cc483bc9e1642690730e94 Mon Sep 17 00:00:00 2001 From: Michael Pollmeier Date: Thu, 28 May 2026 14:55:38 +0000 Subject: [PATCH 2/4] [ghidra2cpg] Fix API breakage for Ghidra 12.2 DefinedDataIterator.definedStrings was replaced by DefinedStringIterator.forProgram, and the EXTRACT opcode constant was removed from PcodeOp. Co-Authored-By: Claude Sonnet 4.6 --- .../src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala | 6 +++--- .../main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala | 6 +++--- .../main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala | 6 +++--- .../main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala | 2 -- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala index 94f8faf0d567..2496b14ee79d 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala @@ -6,7 +6,7 @@ import ghidra.framework.protocol.ghidra.Handler import ghidra.framework.{Application, HeadlessGhidraApplicationConfiguration} import ghidra.program.flatapi.FlatProgramAPI import ghidra.program.model.listing.Program -import ghidra.program.util.{DefinedDataIterator, GhidraProgramUtilities} +import ghidra.program.util.{DefinedStringIterator, GhidraProgramUtilities} import ghidra.util.exception.InvalidInputException import io.joern.ghidra2cpg.passes.* import io.joern.ghidra2cpg.passes.arm.ArmFunctionPass @@ -99,8 +99,8 @@ class Ghidra2Cpg extends X2CpgFrontend { val functionIterator = listing.getFunctions(true) val functions = functionIterator.iterator.asScala.toList - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(program) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(program) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala index 97f37248b57a..af42892937dd 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/LiteralPass.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.passes import ghidra.program.flatapi.FlatProgramAPI -import ghidra.program.util.DefinedDataIterator +import ghidra.program.util.DefinedStringIterator import io.shiftleft.codepropertygraph.generated.Cpg import io.shiftleft.codepropertygraph.generated.nodes import io.shiftleft.passes.ForkJoinParallelCpgPass @@ -12,8 +12,8 @@ import scala.language.implicitConversions class LiteralPass(cpg: Cpg, flatProgramAPI: FlatProgramAPI) extends ForkJoinParallelCpgPass[String](cpg) { override def generateParts(): Array[String] = { - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(flatProgramAPI.getCurrentProgram) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(flatProgramAPI.getCurrentProgram) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala index 4af1253276b6..58bdad55dc80 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/passes/PCodePass.scala @@ -1,7 +1,7 @@ package io.joern.ghidra2cpg.passes import ghidra.program.model.listing.{Function, Program} -import ghidra.program.util.DefinedDataIterator +import ghidra.program.util.DefinedStringIterator import io.joern.ghidra2cpg.* import io.joern.ghidra2cpg.utils.Utils.* import io.joern.ghidra2cpg.utils.{Decompiler, PCodeMapper} @@ -15,8 +15,8 @@ import scala.language.implicitConversions class PCodePass(currentProgram: Program, fileName: String, functions: List[Function], cpg: Cpg, decompiler: Decompiler) extends ForkJoinParallelCpgPass[Function](cpg) { - val address2Literals: Map[Long, String] = DefinedDataIterator - .definedStrings(currentProgram) + val address2Literals: Map[Long, String] = DefinedStringIterator + .forProgram(currentProgram) .iterator() .asScala .toList diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala index d24f15f3b5db..015f61eebbba 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/utils/PCodeMapper.scala @@ -303,8 +303,6 @@ class PCodeMapper( handleSingleArgument(pcodeOp, ".cast", pcodeOp.getMnemonic) case CPOOLREF => handleSingleArgument(pcodeOp, ".cpoolref", pcodeOp.getMnemonic) - case EXTRACT => - handleSingleArgument(pcodeOp, ".extract", pcodeOp.getMnemonic) case FLOAT_ABS => handleSingleArgument(pcodeOp, ".abs", pcodeOp.getMnemonic) case FLOAT_CEIL => From 4bc10d4df5a7413ab6d7871643fbc381af9c886b Mon Sep 17 00:00:00 2001 From: Michael Pollmeier Date: Thu, 28 May 2026 14:59:50 +0000 Subject: [PATCH 3/4] [ghidra2cpg] Migrate from deprecated GhidraProject.importProgram to ProgramLoader GhidraProject.importProgram is deprecated since Ghidra 12.0 for removal, and -Werror turns it into a compile error. Co-Authored-By: Claude Sonnet 4.6 --- .../io/joern/ghidra2cpg/Ghidra2Cpg.scala | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala index 2496b14ee79d..cd341aa43f2b 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala @@ -1,6 +1,8 @@ package io.joern.ghidra2cpg import ghidra.GhidraJarApplicationLayout +import ghidra.app.plugin.core.analysis.AutoAnalysisManager +import ghidra.app.util.importer.ProgramLoader import ghidra.base.project.GhidraProject import ghidra.framework.protocol.ghidra.Handler import ghidra.framework.{Application, HeadlessGhidraApplicationConfiguration} @@ -8,6 +10,7 @@ import ghidra.program.flatapi.FlatProgramAPI import ghidra.program.model.listing.Program import ghidra.program.util.{DefinedStringIterator, GhidraProgramUtilities} import ghidra.util.exception.InvalidInputException +import ghidra.util.task.TaskMonitor import io.joern.ghidra2cpg.passes.* import io.joern.ghidra2cpg.passes.arm.ArmFunctionPass import io.joern.ghidra2cpg.passes.mips.{LoHiPass, MipsFunctionPass} @@ -48,14 +51,25 @@ class Ghidra2Cpg extends X2CpgFrontend { // The 'true' parameter indicates this is a temporary project project = GhidraProject.createProject(tempWorkingDir.absolutePathAsString, CommandLineConfig.projectName, true) - program = project.importProgram(inputFile) - addProgramToCpg(program, inputFile.getCanonicalPath, cpg) + val loadResults = ProgramLoader.builder() + .source(inputFile) + .project(project.getProject) + .monitor(TaskMonitor.DUMMY) + .load() + program = loadResults.getPrimaryDomainObject(this) + val txId = program.startTransaction("Batch Processing") + AutoAnalysisManager.getAnalysisManager(program).initializeOptions() + try { + addProgramToCpg(program, inputFile.getCanonicalPath, cpg) + } finally { + program.endTransaction(txId, true) + program.release(this) + } } catch { case e: Exception => e.printStackTrace() } finally { // Closing deletes the project (since we created a temporary project) - // Closing also releases the program project.close() } } From 89f8036357593f5d842b16f265691461decce350 Mon Sep 17 00:00:00 2001 From: Michael Pollmeier Date: Thu, 28 May 2026 17:25:32 +0200 Subject: [PATCH 4/4] fmt --- .../src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala index cd341aa43f2b..16c66f0c1b95 100644 --- a/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala +++ b/joern-cli/frontends/ghidra2cpg/src/main/scala/io/joern/ghidra2cpg/Ghidra2Cpg.scala @@ -51,7 +51,8 @@ class Ghidra2Cpg extends X2CpgFrontend { // The 'true' parameter indicates this is a temporary project project = GhidraProject.createProject(tempWorkingDir.absolutePathAsString, CommandLineConfig.projectName, true) - val loadResults = ProgramLoader.builder() + val loadResults = ProgramLoader + .builder() .source(inputFile) .project(project.getProject) .monitor(TaskMonitor.DUMMY)