Browse Source

Add MaybeSwap for coffsectionrec records (needed for cross-endian compilation)

Pierre Muller 1 year ago
parent
commit
9648463eb5
1 changed files with 14 additions and 8 deletions
  1. 14 8
      compiler/ogcoff.pas

+ 14 - 8
compiler/ogcoff.pas

@@ -1841,6 +1841,7 @@ const pemagic : array[0..3] of byte = (
             else
               secrec.nrelocs:=65535;
             inc(symidx);
+	    MaybeSwap(secrec);
             FCoffSyms.write(secrec,sizeof(secrec));
             { aux recs have the same size as symbols, so we need to add two
               Byte of padding in case of a Big Obj Coff }
@@ -2396,7 +2397,8 @@ const pemagic : array[0..3] of byte = (
         strname   : string;
         auxrec    : array[0..sizeof(coffsymbol)-1] of byte;
         boauxrec  : array[0..sizeof(coffbigobjsymbol)-1] of byte;
-        secrec    : pcoffsectionrec;
+        psecrec   : pcoffsectionrec;
+        secrec    : coffsectionrec;
         objsec    : TObjSection;
         secidx    : longint;
         symvalue  : longword;
@@ -2546,15 +2548,19 @@ const pemagic : array[0..3] of byte = (
                   if bigobj then
                     begin
                       FCoffSyms.Read(boauxrec,sizeof(boauxrec));
-                      secrec:=pcoffsectionrec(@boauxrec[0]);
+                      psecrec:=pcoffsectionrec(@boauxrec[0]);
+		      secrec:=psecrec^;
+		      MaybeSwap(secrec);
                     end
                   else
                     begin
                       FCoffSyms.Read(auxrec,sizeof(auxrec));
-                      secrec:=pcoffsectionrec(@auxrec);
+                      psecrec:=pcoffsectionrec(@auxrec);
+		      secrec:=psecrec^;
+		      MaybeSwap(secrec);
                     end;
 
-                  case secrec^.select of
+                  case secrec.select of
                     IMAGE_COMDAT_SELECT_NODUPLICATES:
                       comdatsel:=oscs_none;
                     IMAGE_COMDAT_SELECT_ANY:
@@ -2569,14 +2575,14 @@ const pemagic : array[0..3] of byte = (
                       comdatsel:=oscs_largest;
                     else begin
                       comdatsel:=oscs_none;
-                      Message2(link_e_comdat_select_unsupported,inttostr(secrec^.select),objsym.objsection.name);
+                      Message2(link_e_comdat_select_unsupported,inttostr(secrec.select),objsym.objsection.name);
                     end;
                   end;
 
                   if comdatsel in [oscs_associative,oscs_exact_match] then
                     { only temporary }
                     Comment(V_Error,'Associative or exact match COMDAT sections are not yet supported (symbol: '+objsym.objsection.Name+')')
-                  else if (comdatsel=oscs_associative) and (secrec^.assoc=0) then
+                  else if (comdatsel=oscs_associative) and (secrec.assoc=0) then
                     Message1(link_e_comdat_associative_section_expected,objsym.objsection.name)
                   else if (objsym.objsection.ComdatSelection<>oscs_none) and (comdatsel<>oscs_none) and (objsym.objsection.ComdatSelection<>comdatsel) then
                     Message2(link_e_comdat_not_matching,objsym.objsection.Name,objsym.Name)
@@ -2584,9 +2590,9 @@ const pemagic : array[0..3] of byte = (
                     begin
                       objsym.objsection.ComdatSelection:=comdatsel;
 
-                      if (secrec^.assoc<>0) and not assigned(objsym.objsection.AssociativeSection) then
+                      if (secrec.assoc<>0) and not assigned(objsym.objsection.AssociativeSection) then
                         begin
-                          objsym.objsection.AssociativeSection:=GetSection(secrec^.assoc);
+                          objsym.objsection.AssociativeSection:=GetSection(secrec.assoc);
                           if not assigned(objsym.objsection.AssociativeSection) then
                             Message1(link_e_comdat_associative_section_not_found,objsym.objsection.Name);
                         end;