Browse Source

+ support writing 32-bit LEDATA OMF records

git-svn-id: trunk@39092 -
nickysn 7 years ago
parent
commit
f5862efcd4
1 changed files with 22 additions and 4 deletions
  1. 22 4
      compiler/ogomf.pas

+ 22 - 4
compiler/ogomf.pas

@@ -762,6 +762,7 @@ implementation
         ChunkFixupStart,ChunkFixupEnd: Integer;
         ChunkFixupStart,ChunkFixupEnd: Integer;
         SegIndex: Integer;
         SegIndex: Integer;
         NextOfs: Integer;
         NextOfs: Integer;
+        Is32BitLEDATA: Boolean;
         I: Integer;
         I: Integer;
       begin
       begin
         if (oso_data in sec.SecOptions) then
         if (oso_data in sec.SecOptions) then
@@ -792,11 +793,28 @@ implementation
                   Dec(ChunkFixupEnd);
                   Dec(ChunkFixupEnd);
                 end;
                 end;
               { write LEDATA record }
               { write LEDATA record }
-              RawRecord.RecordType:=RT_LEDATA;
+              Is32BitLEDATA:=TOmfObjSection(sec).Use=suUse32;
+              if Is32BitLEDATA then
+                RawRecord.RecordType:=RT_LEDATA32
+              else
+                RawRecord.RecordType:=RT_LEDATA;
               NextOfs:=RawRecord.WriteIndexedRef(0,SegIndex);
               NextOfs:=RawRecord.WriteIndexedRef(0,SegIndex);
-              RawRecord.RawData[NextOfs]:=Byte(ChunkStart);
-              RawRecord.RawData[NextOfs+1]:=Byte(ChunkStart shr 8);
-              Inc(NextOfs,2);
+              if Is32BitLEDATA then
+                begin
+                  RawRecord.RawData[NextOfs]:=Byte(ChunkStart);
+                  RawRecord.RawData[NextOfs+1]:=Byte(ChunkStart shr 8);
+                  RawRecord.RawData[NextOfs+2]:=Byte(ChunkStart shr 16);
+                  RawRecord.RawData[NextOfs+3]:=Byte(ChunkStart shr 24);
+                  Inc(NextOfs,4);
+                end
+              else
+                begin
+                  if ChunkStart>$ffff then
+                    internalerror(2018052201);
+                  RawRecord.RawData[NextOfs]:=Byte(ChunkStart);
+                  RawRecord.RawData[NextOfs+1]:=Byte(ChunkStart shr 8);
+                  Inc(NextOfs,2);
+                end;
               sec.data.read(RawRecord.RawData[NextOfs], ChunkLen);
               sec.data.read(RawRecord.RawData[NextOfs], ChunkLen);
               Inc(NextOfs, ChunkLen);
               Inc(NextOfs, ChunkLen);
               RawRecord.RecordLength:=NextOfs+1;
               RawRecord.RecordLength:=NextOfs+1;