Explorar o código

* skip the MZ exe in order to reach the ELF32 image on i8086-msdos

git-svn-id: trunk@39032 -
nickysn %!s(int64=7) %!d(string=hai) anos
pai
achega
0d8ba2ddfa
Modificáronse 1 ficheiros con 23 adicións e 1 borrados
  1. 23 1
      rtl/inc/exeinfo.pp

+ 23 - 1
rtl/inc/exeinfo.pp

@@ -165,7 +165,7 @@ uses
                               DOS Stub
 ****************************************************************************}
 
-{$if defined(EMX) or defined(PE32) or defined(PE32PLUS) or defined(GO32V2)}
+{$if defined(EMX) or defined(PE32) or defined(PE32PLUS) or defined(GO32V2) or defined(MSDOS)}
 type
   tdosheader = packed record
      e_magic : word;
@@ -924,13 +924,35 @@ end;
 {$endif FIND_BASEADDR_ELF}
 
 function OpenElf(var e:TExeFile):boolean;
+{$ifdef MSDOS}
+const
+  ParagraphSize = 512;
+{$endif MSDOS}
 var
   elfheader : telfheader;
   elfsec    : telfsechdr;
   phdr      : telfproghdr;
   i         : longint;
+{$ifdef MSDOS}
+  DosHeader : tdosheader;
+  BRead     : cardinal;
+{$endif MSDOS}
 begin
   OpenElf:=false;
+{$ifdef MSDOS}
+  { read and check header }
+  if E.Size < SizeOf (DosHeader) then
+   Exit;
+  BlockRead (E.F, DosHeader, SizeOf (DosHeader), BRead);
+  if BRead <> SizeOf (DosHeader) then
+   Exit;
+  if DosHeader.E_Magic = $5A4D then
+  begin
+   E.ImgOffset := DosHeader.e_cp * ParagraphSize;
+   if DosHeader.e_cblp > 0 then
+    E.ImgOffset := E.ImgOffset + DosHeader.e_cblp - ParagraphSize;
+  end;
+{$endif MSDOS}
   { read and check header }
   if e.size<(sizeof(telfheader)+e.ImgOffset) then
    exit;