瀏覽代碼

+ parse omf modend records and add symbol for module start address

git-svn-id: trunk@31324 -
nickysn 10 年之前
父節點
當前提交
ef207475fd
共有 2 個文件被更改,包括 47 次插入3 次删除
  1. 46 3
      compiler/ogomf.pas
  2. 1 0
      compiler/systems/t_msdos.pas

+ 46 - 3
compiler/ogomf.pas

@@ -133,6 +133,7 @@ interface
         function ReadGrpDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadExtDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadPubDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
+        function ReadModEnd(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
         function ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
 
         property LNames: TOmfOrderedNameCollection read FLNames;
@@ -1171,6 +1172,49 @@ implementation
         Result:=True;
       end;
 
+    function TOmfObjInput.ReadModEnd(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
+      var
+        ModEndRec: TOmfRecord_MODEND;
+        objsym: TObjSymbol;
+        objsec: TOmfObjSection;
+      begin
+        Result:=False;
+        ModEndRec:=TOmfRecord_MODEND.Create;
+        ModEndRec.DecodeFrom(RawRec);
+        if ModEndRec.HasStartAddress then
+          begin
+            if not ModEndRec.LogicalStartAddress then
+              begin
+                InputError('Physical start address not supported');
+                ModEndRec.Free;
+                exit;
+              end;
+            if not (ModEndRec.TargetMethod in [ftmSegmentIndex,ftmSegmentIndexNoDisp]) then
+              begin
+                InputError('Target method for start address other than "Segment Index" is not supported');
+                ModEndRec.Free;
+                exit;
+              end;
+            if (ModEndRec.TargetDatum<1) or (ModEndRec.TargetDatum>objdata.ObjSectionList.Count) then
+              begin
+                InputError('Segment name index for start address out of range');
+                ModEndRec.Free;
+                exit;
+              end;
+            objsec:=TOmfObjSection(objdata.ObjSectionList[ModEndRec.TargetDatum-1]);
+
+            objsym:=objdata.CreateSymbol('..start');
+            objsym.bind:=AB_GLOBAL;
+            objsym.typ:=AT_FUNCTION;
+            //objsym.group:=basegroup;
+            objsym.objsection:=objsec;
+            objsym.offset:=ModEndRec.TargetDisplacement;
+            objsym.size:=0;
+          end;
+        ModEndRec.Free;
+        Result:=True;
+      end;
+
     function TOmfObjInput.ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata: TObjData): Boolean;
       var
         Is32Bit: Boolean;
@@ -1359,9 +1403,8 @@ implementation
                 exit;
               end;
             RT_MODEND,RT_MODEND32:
-              begin
-                {todo}
-              end;
+              if not ReadModEnd(FRawRecord,objdata) then
+                exit;
             else
               begin
                 InputError('Unsupported OMF record type $'+HexStr(FRawRecord.RecordType,2));

+ 1 - 0
compiler/systems/t_msdos.pas

@@ -440,6 +440,7 @@ begin
     if s<>'' then
       LinkScript.Concat('READSTATICLIBRARY '+MaybeQuoted(s));
   end;
+  LinkScript.Concat('ENTRYNAME ..start');
 end;
 
 constructor TInternalLinkerMsDos.create;