diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java index a0580737a3..9984864649 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java @@ -72,6 +72,7 @@ public class MemoryBlockDB implements MemoryBlock { } length = lRecord.getLongValue(MemoryMapDBAdapter.LENGTH_COL); lastSubBlock = null; + Collections.sort(list); subBlocks = list; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/SubMemoryBlock.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/SubMemoryBlock.java index f7cfb6fc05..8a7e28957a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/SubMemoryBlock.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/SubMemoryBlock.java @@ -26,7 +26,7 @@ import ghidra.program.model.mem.*; * Interface for the various types of memory block sections. They are used by a {@link MemoryBlockDB} * to do the actual storing and fetching of the bytes that make up a MemoryBlock */ -abstract class SubMemoryBlock { +abstract class SubMemoryBlock implements Comparable { protected final MemoryMapDBAdapter adapter; protected final Record record; @@ -249,4 +249,12 @@ abstract class SubMemoryBlock { protected abstract ByteSourceRangeList getByteSourceRangeList(MemoryBlock block, Address start, long memBlockOffset, long size); + @Override + public int compareTo(SubMemoryBlock o) { + long result = getStartingOffset() - o.getStartingOffset(); + if (result == 0) { + return 0; + } + return result > 0 ? 1 : -1; + } }