diff --git a/Ghidra/Configurations/Public_Release/src/global/docs/WhatsNew.html b/Ghidra/Configurations/Public_Release/src/global/docs/WhatsNew.html
index 5ffbbb4dd9..ed8ac86ac1 100644
--- a/Ghidra/Configurations/Public_Release/src/global/docs/WhatsNew.html
+++ b/Ghidra/Configurations/Public_Release/src/global/docs/WhatsNew.html
@@ -49,30 +49,25 @@
The not-so-fine print: Please Read!
+ This release includes new features, enhancements, performance improvements, quite a few bug fixes, and many pull-request
+ contributions. Thanks to all those who have contributed their time, thoughts, and code. The Ghidra user community thanks you too!
+
Ghidra 11.0 is fully backward compatible with project data from previous releases.
However, programs and data type archives which are created or modified in 11.0 will not be useable by an earlier Ghidra version.
- This release includes new features, enhancements, performance improvements, quite a few bug fixes, and many pull-request
- contributions. Thanks to all those who have contributed their time, thoughts, and code. The Ghidra user community thanks you too!
-
- IMPORTANT: Ghidra requires Java 17 JDK to run. A newer version of Java may be acceptable but has not been fully tested. Please see the
+
This distribution requires JDK 17 to run, and provides Linux x86-64, Windows x86-64, and macOS x86-64 native components.
+ If you have another platform or wish to use a newer JDK, please see the
Ghidra Installation Guide for additional information.
-
- NOTE: Please note that any programs imported with a Ghidra beta version or code built directly from source code outside of a release tag may not be compatible,
- and may have flaws that won't be corrected by using this new release. Any programs analyzed from a beta or other local master source build should be considered
- experimental and re-imported and analyzed with a release version. Programs imported with previous release versions should upgrade correctly through various
- automatic upgrade mechanisms. Any program you will continue to reverse engineer should be imported fresh with a release version or a build you trust with the
- latest code fixes.
NOTE: Ghidra Server: The Ghidra 11.0 server is compatible with Ghidra 9.2 and later Ghidra clients. Ghidra 11.0
clients are compatible with all 10.x and 9.x servers. Although, due to potential Java version differences, it is recommended
that Ghidra Server installations older than 10.2 be upgraded. Those using 10.2 and newer should not need a server upgrade.
- NOTE: Platform-specific native components can be built directly from a release distribution.
- The distribution currently provides Linux x86-64, Windows x86-64, and macOS x86-64 native components. If you have another platform,
- for example a macOS aarch64 based system or a Linux ARM variant, the support/buildNatives script can build the decompiler,
- demangler, and legacy PDB executables for your platform. Please see the "Building Ghidra Native Components" section in the
- Ghidra Installation Guide for additional information.
+ NOTE: Any programs imported with a Ghidra beta version or code built directly from source code outside of a release tag may not be compatible,
+ and may have flaws that won't be corrected by using this new release. Any programs analyzed from a beta or other local master source build should be considered
+ experimental and re-imported and analyzed with a release version. Programs imported with previous release versions should upgrade correctly through various
+ automatic upgrade mechanisms. Any program you will continue to reverse engineer should be imported fresh with a release version or a build you trust with the
+ latest code fixes.
@@ -103,7 +98,7 @@
to pre-ingested programs within a Ghidra multi-user repository. Clicking on the hyperlink causes Ghidra to display the previously ingested program.
No data other than the Ghidra URL is transferred to Ghidra, and no socket is open within Ghidra listening for commands. GhidraGo must be enabled by
installing a plugin in the Ghidra project manager, and must also be configured as a protocol handler in your web browser. GhidraGo is not setup or enabled by default.
- Please see the included GhidraGoREADME.html, or search for GhidraGo within help.
+ For details on setting up GhidraGo, please see the included GhidraGoREADME.html or search for GhidraGo within help.
Version Tracking
diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/script/WindowsResourceReferenceScriptTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/script/WindowsResourceReferenceScriptTest.java
index b6b41f6b4c..5df3d11bf7 100644
--- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/script/WindowsResourceReferenceScriptTest.java
+++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/app/plugin/core/script/WindowsResourceReferenceScriptTest.java
@@ -54,12 +54,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
pm.openProgram(program.getDomainFile());
}
- private void closeProgram() {
- ProgramManager pm = env.getTool().getService(ProgramManager.class);
- pm.closeProgram();
- waitForSwing();
- }
-
@After
public void tearDown() throws Exception {
env.dispose();
@@ -102,7 +96,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
//Check the reference type created is of type DATA
assertTrue(type.equals(RefType.DATA));
}
- closeProgram();
}
@Test
@@ -135,8 +128,6 @@ public class WindowsResourceReferenceScriptTest extends AbstractGhidraHeadedInte
//check the reference type created is of type DATA
assertTrue(type.equals(RefType.DATA));
}
-
- closeProgram();
}
private Address addr(long offset, Program program) {
diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ByteViewerToolConnectionTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ByteViewerToolConnectionTest.java
index dddfa64e0b..ecbbf4e5ab 100644
--- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ByteViewerToolConnectionTest.java
+++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ByteViewerToolConnectionTest.java
@@ -28,13 +28,17 @@ import org.junit.*;
import docking.DefaultActionContext;
import docking.action.DockingActionIf;
import docking.test.AbstractDockingTest;
+import ghidra.app.events.OpenProgramPluginEvent;
import ghidra.app.plugin.core.byteviewer.ByteViewerPlugin;
+import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.services.ProgramManager;
import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.PluginException;
import ghidra.program.database.ProgramBuilder;
+import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program;
+import ghidra.program.util.ProgramLocation;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.test.TestEnv;
@@ -61,8 +65,9 @@ public class ByteViewerToolConnectionTest extends AbstractGhidraHeadedIntegratio
pressButtonByText(dialog, "OK");
}
- closeAllWindows();
env.dispose();
+
+ closeAllWindows();
}
@Test
@@ -83,17 +88,39 @@ public class ByteViewerToolConnectionTest extends AbstractGhidraHeadedIntegratio
producerList.setSelectedIndex(0);
consumerList.setSelectedIndex(1);
- clickRow(eventList, 1);
+ int eventCount = eventList.getModel().getSize();
+ for (int i = 0; i < eventCount; i++) {
+ clickRow(eventList, i);
+ }
Program p = buildProgram();
ProgramManager pm = cbTool.getService(ProgramManager.class);
- SwingUtilities.invokeAndWait(() -> pm.openProgram(p.getDomainFile()));
+ runSwing(() -> pm.openProgram(p.getDomainFile()));
+
+ waitForSwing();
ProgramManager pm2 = cbTool2.getService(ProgramManager.class);
+ assertNull(pm2.getCurrentProgram());
+
+ // open same program in second tool - cannot rely on tool connection for this
+ cbTool2.firePluginEvent(new OpenProgramPluginEvent("Test", p));
+
+ waitForSwing();
+
assertEquals(p, pm2.getCurrentProgram());
- env.release(p);
+ Address a = p.getAddressFactory().getDefaultAddressSpace().getAddress(0x1001010);
+
+ CodeBrowserPlugin cb1 = getPlugin(cbTool, CodeBrowserPlugin.class);
+ cb1.goTo(new ProgramLocation(p, a), true);
+
+ waitForSwing();
+
+ CodeBrowserPlugin cb2 = getPlugin(cbTool2, CodeBrowserPlugin.class);
+ ProgramLocation loc = cb2.getCurrentLocation();
+ assertNotNull(loc);
+ assertEquals(a, loc.getAddress());
}
private void clickRow(JList> list, int row) {
diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ToolConnectionTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ToolConnectionTest.java
index b22e8d63cb..072d13d784 100644
--- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ToolConnectionTest.java
+++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/framework/main/ToolConnectionTest.java
@@ -27,13 +27,17 @@ import org.junit.*;
import docking.DefaultActionContext;
import docking.action.DockingActionIf;
+import ghidra.app.events.OpenProgramPluginEvent;
import ghidra.app.plugin.core.byteviewer.ByteViewerPlugin;
+import ghidra.app.plugin.core.codebrowser.CodeBrowserPlugin;
import ghidra.app.services.ProgramManager;
import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.PluginException;
import ghidra.program.database.ProgramBuilder;
+import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Program;
+import ghidra.program.util.ProgramLocation;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.test.TestEnv;
@@ -75,9 +79,9 @@ public class ToolConnectionTest extends AbstractGhidraHeadedIntegrationTest {
close(dialog);
}
- closeAllWindows();
-
env.dispose();
+
+ closeAllWindows();
}
@Test
@@ -85,21 +89,42 @@ public class ToolConnectionTest extends AbstractGhidraHeadedIntegrationTest {
connectTools();
- clickListRow(eventList, 1);
+ int eventCount = eventList.getModel().getSize();
+ for (int i = 0; i < eventCount; i++) {
+ clickListRow(eventList, i);
+ }
+
pressButtonByText(dialog, "OK");
Program p = buildNotepad();
ProgramManager pm = tool1.getService(ProgramManager.class);
- ProgramManager pm2 = tool2.getService(ProgramManager.class);
runSwing(() -> pm.openProgram(p.getDomainFile()));
- waitForCondition(() -> pm2.getCurrentProgram() != null,
- "Tool 2 did not open a proagram when one was opened in tool1");
+ waitForSwing();
+
+ ProgramManager pm2 = tool2.getService(ProgramManager.class);
+ assertNull(pm2.getCurrentProgram());
+
+ // open same program in second tool - cannot rely on tool connection for this
+ tool2.firePluginEvent(new OpenProgramPluginEvent("Test", p));
+
+ waitForSwing();
assertEquals(p, pm2.getCurrentProgram());
- env.release(p);
+ Address a = p.getAddressFactory().getDefaultAddressSpace().getAddress(0x1001010);
+
+ CodeBrowserPlugin cb1 = getPlugin(tool1, CodeBrowserPlugin.class);
+ cb1.goTo(new ProgramLocation(p, a), true);
+
+ waitForSwing();
+
+ CodeBrowserPlugin cb2 = getPlugin(tool2, CodeBrowserPlugin.class);
+ ProgramLocation loc = cb2.getCurrentLocation();
+ assertNotNull(loc);
+ assertEquals(a, loc.getAddress());
+
}
@Test