Bläddra i källkod

Declare MaybeSwap in ogcoff interface part to allow use in t_win unit in PostProcessExecutable

Pierre Muller 1 vecka sedan
förälder
incheckning
6082b1b2f7
2 ändrade filer med 12 tillägg och 0 borttagningar
  1. 3 0
      compiler/ogcoff.pas
  2. 9 0
      compiler/systems/t_win.pas

+ 3 - 0
compiler/ogcoff.pas

@@ -295,6 +295,9 @@ interface
        COFF_BIG_OBJ_VERSION = 2;
 
     function ReadDLLImports(const dllname:string;readdllproc:Treaddllproc):boolean;
+    procedure MaybeSwap(var v : tcoffsechdr);
+    procedure MaybeSwap(var v : tcoffheader);
+    procedure MaybeSwap(var v : tcoffpeoptheader);
 
 implementation
 

+ 9 - 0
compiler/systems/t_win.pas

@@ -1692,11 +1692,15 @@ implementation
           Message1(execinfo_f_cant_open_executable,fn);
         { read headers }
         blockread(f,dosheader,sizeof(tdosheader));
+        if source_info.endian<>target_info.endian then
+          dosheader.e_lfanew:=SwapEndian(dosheader.e_lfanew);
         peheaderpos:=dosheader.e_lfanew;
         { skip to headerpos and skip pe magic }
         seek(f,peheaderpos+4);
         blockread(f,peheader,sizeof(tcoffheader));
+	maybeswap(peheader);
         blockread(f,peoptheader,sizeof(tcoffpeoptheader));
+	maybeswap(peoptheader);
         { write info }
         Message1(execinfo_x_codesize,tostr(peoptheader.tsize));
         Message1(execinfo_x_initdatasize,tostr(peoptheader.dsize));
@@ -1739,16 +1743,20 @@ implementation
         peheader.time:=0;
         { write header back, skip pe magic }
         seek(f,peheaderpos+4);
+	maybeswap(peheader);
         blockwrite(f,peheader,sizeof(tcoffheader));
         if ioresult<>0 then
           Message1(execinfo_f_cant_process_executable,fn);
+	maybeswap(peoptheader);
         blockwrite(f,peoptheader,sizeof(tcoffpeoptheader));
         if ioresult<>0 then
           Message1(execinfo_f_cant_process_executable,fn);
         { skip to headerpos and skip pe magic }
         seek(f,peheaderpos+4);
         blockread(f,peheader,sizeof(tcoffheader));
+	maybeswap(peheader);
         blockread(f,peoptheader,sizeof(tcoffpeoptheader));
+	maybeswap(peoptheader);
         { write the value after the change }
         Message1(execinfo_x_stackreserve,tostr(peoptheader.SizeOfStackReserve));
         Message1(execinfo_x_stackcommit,tostr(peoptheader.SizeOfStackCommit));
@@ -1759,6 +1767,7 @@ implementation
         for l:=1 to peheader.nsects do
          begin
            blockread(f,coffsec,sizeof(tcoffsechdr));
+	   maybeswap(coffsec);
            if coffsec.datapos>0 then
             begin
               if secroot=nil then