46
46
import ghidra .program .model .data .*;
47
47
import ghidra .program .model .listing .*;
48
48
import ghidra .program .model .mem .MemoryAccessException ;
49
+ import ghidra .program .model .mem .MemoryBlock ;
49
50
import ghidra .program .model .reloc .Relocation .Status ;
50
51
import ghidra .program .model .reloc .RelocationTable ;
51
52
import ghidra .program .model .symbol .*;
@@ -671,6 +672,7 @@ protected Map<SectionHeader, Address> processMemoryBlocks(PortableExecutable pe,
671
672
int rawDataSize = sections [i ].getSizeOfRawData ();
672
673
int rawDataPtr = sections [i ].getPointerToRawData ();
673
674
virtualSize = sections [i ].getVirtualSize ();
675
+ MemoryBlock block = null ;
674
676
if (rawDataSize != 0 && rawDataPtr != 0 ) {
675
677
int dataSize =
676
678
((rawDataSize > virtualSize && virtualSize > 0 ) || rawDataSize < 0 )
@@ -682,8 +684,8 @@ protected Map<SectionHeader, Address> processMemoryBlocks(PortableExecutable pe,
682
684
Msg .warn (this , "OptionalHeader.SizeOfImage < size of " +
683
685
sections [i ].getName () + " section" );
684
686
}
685
- MemoryBlockUtils .createInitializedBlock (prog , false , sectionName , address ,
686
- fileBytes , rawDataPtr , dataSize , "" , "" , r , w , x , log );
687
+ block = MemoryBlockUtils .createInitializedBlock (prog , false , sectionName ,
688
+ address , fileBytes , rawDataPtr , dataSize , "" , "" , r , w , x , log );
687
689
sectionToAddress .put (sections [i ], address );
688
690
}
689
691
if (rawDataSize == virtualSize ) {
@@ -711,9 +713,24 @@ else if (rawDataSize > virtualSize) {
711
713
else {
712
714
int dataSize = (virtualSize > 0 || rawDataSize < 0 ) ? virtualSize : 0 ;
713
715
if (dataSize > 0 ) {
714
- MemoryBlockUtils .createUninitializedBlock (prog , false , sectionName , address ,
715
- dataSize , "" , "" , r , w , x , log );
716
- sectionToAddress .putIfAbsent (sections [i ], address );
716
+ if (block != null ) {
717
+ MemoryBlock paddingBlock =
718
+ MemoryBlockUtils .createInitializedBlock (prog , false , sectionName ,
719
+ address , dataSize , "" , "" , r , w , x , log );
720
+ if (paddingBlock != null ) {
721
+ try {
722
+ prog .getMemory ().join (block , paddingBlock );
723
+ }
724
+ catch (Exception e ) {
725
+ log .appendMsg (e .getMessage ());
726
+ }
727
+ }
728
+ }
729
+ else {
730
+ MemoryBlockUtils .createUninitializedBlock (prog , false , sectionName ,
731
+ address , dataSize , "" , "" , r , w , x , log );
732
+ sectionToAddress .putIfAbsent (sections [i ], address );
733
+ }
717
734
}
718
735
}
719
736
0 commit comments