From 2d2584517c86c4b2f40586b861845d14087c9431 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:36:39 +0000 Subject: [PATCH 1/4] GP-3611 fix C-parsing of #pragma lines with multiple lines and comments --- .../javacc/ghidra/app/util/cparser/CPP/CPP.jj | 22 ++++++++++++------- .../app/util/cparser/PreProcessorTest.java | 9 ++++++++ .../app/util/cparser/PreProcessorTest.h | 8 +++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj index 14a0b8c3fc..33560bbcb8 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj @@ -1726,10 +1726,10 @@ PPToken MacroVals() : {Token s,t,u=new Token();u.image="";} } PPToken Pragma() : -{Token t;} -{ t= { - PPToken pt = new PPToken(t); - if (emitExecSwitch==true) println("#pragma " + defs.expand(t.image,true)); return pt; +{Token t,u=null; } +{ (LOOKAHEAD(2)(t= { if (u==null) { u = t; } else { u.image += t.image; } } ))+ { + PPToken pt = new PPToken(u); + if (emitExecSwitch==true) println("#pragma " + defs.expand(u.image,true)); return pt; } } @@ -1908,7 +1908,7 @@ PPToken NewLines() : t= | // newline coming from // t= | t= | - t= | + t= | t= | t= | t= | @@ -2691,13 +2691,19 @@ TOKEN : { TOKEN : { - ()* > : DEFAULT | - > : DEFAULT + ( ~["\\","\n","\r","/"," ","\t"] | + () + )+ > : PRAGMA | + > : DEFAULT } SKIP : { - <_WSP1: > : PRAGMA + <_LCMTPRAG: > : LINECOMMENT | + <_SCMT_PRAG: ( ( | ("*" ~["/"]) | ("/"))+ ) > : PRAGMA | + <_COD_WSP: > : PRAGMA | + <_COD_PRAG: > : PRAGMA } diff --git a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/PreProcessorTest.java b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/PreProcessorTest.java index ae699694b2..fcbd7af84e 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/PreProcessorTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/app/util/cparser/PreProcessorTest.java @@ -127,6 +127,15 @@ public class PreProcessorTest extends AbstractGenericTest { "\" second line\"\n" + "\" third line\"\n" + "\" fourth line\")") != -1); + + assertTrue("multi line #pragma failed ", results + .indexOf("#pragma multiple lines pragma") != -1); + + assertTrue("#pragma with comment failed ", results + .indexOf("#pragma no comment here") != -1); + + assertTrue("#pragma with EOL comment failed ", results + .indexOf("#pragma with no EOL comment here") != -1); } @Test diff --git a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/PreProcessorTest.h b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/PreProcessorTest.h index 093a181628..cc3afcb769 100644 --- a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/PreProcessorTest.h +++ b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/PreProcessorTest.h @@ -106,6 +106,14 @@ int foo; #pragma once +#pragma multiple \ + lines \ + pragma + +#pragma no comment here /* no comment / here */ + +#pragma with no EOL comment here // no comment here + #define PTYPE 4 #define TYPE2 2 /* 2 */ From 081f1a6338c34e7ea02ccec7a6e0c54a7148c770 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:53:10 +0000 Subject: [PATCH 2/4] GP-3612 Always use program architecture when parsing header files to program --- .../plugin/core/cparser/CParserPlugin.java | 20 ++++++++++++++----- .../app/plugin/core/cparser/ParseDialog.java | 20 +++++++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java index bf55b2c8a1..e485c51c7a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java @@ -41,6 +41,7 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.PluginStatus; import ghidra.program.database.data.ProgramDataTypeManager; import ghidra.program.model.data.*; +import ghidra.program.model.lang.LanguageCompilerSpecPair; import ghidra.program.model.listing.Program; import ghidra.util.*; import ghidra.util.exception.CancelledException; @@ -300,16 +301,25 @@ public class CParserPlugin extends ProgramPlugin { /* * Parse into the current programs data type manager + * + * Always uses the program's processor architecture */ - protected void parse(String[] filenames, String[] includePaths, String options, - String languageIDString, String compilerIDString) { + protected void parse(String[] filenames, String[] includePaths, String options) { if (currentProgram == null) { Msg.showInfo(getClass(), parseDialog.getComponent(), "No Open Program", "A program must be open to \"Parse to Program\""); return; } + /* + * always use the processor/compiler for the program when parsing to program + */ + LanguageCompilerSpecPair languageCompilerSpecPair = currentProgram.getLanguageCompilerSpecPair(); + String procID = languageCompilerSpecPair.languageID.getIdAsString(); + String compilerID = languageCompilerSpecPair.compilerSpecID.getIdAsString(); + int result = OptionDialog.showOptionDialog(parseDialog.getComponent(), "Confirm", - "Parse C source to \"" + currentProgram.getDomainFile().getName() + "\"?", "Continue"); + "Parse C source to \"" + currentProgram.getDomainFile().getName() + "\"?" + "\n\n" + + "Using program architecture: " + procID + " / " + compilerID, "Continue"); if (result == OptionDialog.CANCEL_OPTION) { return; @@ -320,8 +330,8 @@ public class CParserPlugin extends ProgramPlugin { .setFileNames(filenames) .setIncludePaths(includePaths) .setOptions(options) - .setLanguageID(languageIDString) - .setCompilerID(compilerIDString); + .setLanguageID(procID) + .setCompilerID(compilerID); tool.execute(parseTask); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java index 298463fff2..043c9384b0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/ParseDialog.java @@ -804,22 +804,22 @@ class ParseDialog extends ReusableDialogComponentProvider { paths = expandPaths(paths); pathPanel.setPaths(paths); - if (languageIDString == null || compilerIDString == null) { - Msg.showWarn(getClass(), rootPanel, "Program Architecture not Specified", - "A Program Architecture must be specified in order to parse to a file."); - return; - } - - if (parseToFile) { + if (parseToFile) { + if (languageIDString == null || compilerIDString == null) { + Msg.showWarn(getClass(), rootPanel, "Program Architecture not Specified", + "A Program Architecture must be specified in order to parse to a file."); + return; + } + File file = getSaveFile(); if (file != null) { plugin.parse(paths, includePaths, options, languageIDString, compilerIDString, file.getAbsolutePath()); } + return; } - else { - plugin.parse(paths, includePaths, options, languageIDString, compilerIDString); - } + + plugin.parse(paths, includePaths, options); } private String[] expandPaths(String[] paths) { From bc40f20c0cc50ecf123768c2f470162d1518ef34 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Mon, 10 Jul 2023 11:36:32 -0400 Subject: [PATCH 3/4] GP-3302 corrected EXTERNAL thunk function creation which resulted in duplciate symbol --- .../app/cmd/function/CreateThunkFunctionCmd.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateThunkFunctionCmd.java b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateThunkFunctionCmd.java index 79d704577d..9434e5acef 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateThunkFunctionCmd.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/CreateThunkFunctionCmd.java @@ -16,10 +16,7 @@ package ghidra.app.cmd.function; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import ghidra.app.util.PseudoDisassembler; @@ -27,11 +24,7 @@ import ghidra.framework.cmd.BackgroundCommand; import ghidra.framework.model.DomainObject; import ghidra.program.database.function.OverlappingFunctionException; import ghidra.program.model.address.*; -import ghidra.program.model.block.BasicBlockModel; -import ghidra.program.model.block.CodeBlock; -import ghidra.program.model.block.CodeBlockReference; -import ghidra.program.model.block.CodeBlockReferenceIterator; -import ghidra.program.model.block.SimpleBlockModel; +import ghidra.program.model.block.*; import ghidra.program.model.data.DataType; import ghidra.program.model.lang.Register; import ghidra.program.model.lang.RegisterValue; @@ -695,6 +688,7 @@ public class CreateThunkFunctionCmd extends BackgroundCommand { ExternalManager extMgr = program.getExternalManager(); ExternalLocation extLoc = extMgr.addExtFunction(Library.UNKNOWN, s.getName(), null, s.getSource()); + s.delete(); // remove original symbol from EXTERNAL block return extLoc.getExternalSpaceAddress(); } catch (DuplicateNameException | InvalidInputException e) { From 3793de0af12fae5a89ed36e7a4fec995be298806 Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Mon, 10 Jul 2023 17:35:43 -0400 Subject: [PATCH 4/4] GP-0: Tweaking buildExtension.gradle checkGradleVersion() variable usage (Closes #5540) --- Ghidra/RuntimeScripts/Common/support/buildExtension.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ghidra/RuntimeScripts/Common/support/buildExtension.gradle b/Ghidra/RuntimeScripts/Common/support/buildExtension.gradle index 94b971aecc..056e6478ff 100644 --- a/Ghidra/RuntimeScripts/Common/support/buildExtension.gradle +++ b/Ghidra/RuntimeScripts/Common/support/buildExtension.gradle @@ -337,7 +337,7 @@ def checkGradleVersion() { GradleVersion min = null; GradleVersion max = null; try { - min = GradleVersion.version("${rootProject.GRADLE_MIN}") + min = GradleVersion.version("${GRADLE_MIN}") } catch (IllegalArgumentException e) { String defaultMin = "1.0" @@ -345,8 +345,8 @@ def checkGradleVersion() { min = GradleVersion.version(defaultMin) } try { - if (rootProject.GRADLE_MAX) { - max = GradleVersion.version("${rootProject.GRADLE_MAX}") + if (GRADLE_MAX) { + max = GradleVersion.version("${GRADLE_MAX}") } } catch (IllegalArgumentException e) {