diff --git a/SabreTools.Serialization/Wrappers/NewExecutable.cs b/SabreTools.Serialization/Wrappers/NewExecutable.cs
index e717c554..54bc8226 100644
--- a/SabreTools.Serialization/Wrappers/NewExecutable.cs
+++ b/SabreTools.Serialization/Wrappers/NewExecutable.cs
@@ -29,7 +29,7 @@ namespace SabreTools.Serialization.Wrappers
/// Address of the overlay, if it exists
///
///
- public int OverlayAddress
+ public long OverlayAddress
{
get
{
@@ -40,7 +40,7 @@ namespace SabreTools.Serialization.Wrappers
return _overlayAddress.Value;
// Get the end of the file, if possible
- int endOfFile = GetEndOfFile();
+ long endOfFile = GetEndOfFile();
if (endOfFile == -1)
return -1;
@@ -49,10 +49,29 @@ namespace SabreTools.Serialization.Wrappers
return -1;
// Search through the segments table to find the furthest
- int endOfSectionData = -1;
+ long endOfSectionData = -1;
foreach (var entry in SegmentTable)
{
- int offset = (entry.Offset << Header.SegmentAlignmentShiftCount) + entry.Length;
+ // Get end of segment data
+ long offset = entry.Offset * (1 << Header.SegmentAlignmentShiftCount) + entry.Length;
+
+ // Read and find the end of the relocation data
+ if ((entry.FlagWord & SegmentTableEntryFlag.RELOCINFO) != 0)
+ {
+ Stream? dataStream = null;
+ if (_byteArrayData != null)
+ dataStream = new MemoryStream(_byteArrayData);
+ else if (_streamData != null)
+ dataStream = _streamData;
+ else
+ break;
+
+ dataStream.Seek(offset, SeekOrigin.Begin);
+ var relocationData = Deserializers.NewExecutable.ParsePerSegmentData(dataStream);
+
+ offset = dataStream.Position;
+ }
+
if (offset > endOfSectionData)
endOfSectionData = offset;
}
@@ -275,7 +294,7 @@ namespace SabreTools.Serialization.Wrappers
///
/// Address of the overlay, if it exists
///
- private int? _overlayAddress = null;
+ private long? _overlayAddress = null;
///
/// Overlay data, if it exists