فهرست منبع

* added import by ordinal number in internal linker.

git-svn-id: trunk@4037 -
yury 19 سال پیش
والد
کامیت
03f892719d
3فایلهای تغییر یافته به همراه62 افزوده شده و 17 حذف شده
  1. 12 8
      compiler/link.pas
  2. 19 0
      compiler/ogbase.pas
  3. 31 9
      compiler/ogcoff.pas

+ 12 - 8
compiler/link.pas

@@ -54,7 +54,7 @@ Type
        Constructor Create;virtual;
        Destructor Destroy;override;
        procedure AddModuleFiles(hp:tmodule);
-       procedure AddExternalSymbol(const libname,symname:string);virtual;
+       procedure AddExternalSymbol(const libname,symname:string;ordnumber: longint);virtual;
        Procedure AddObject(const S,unitpath : String;isunit:boolean);
        Procedure AddStaticLibrary(const S : String);
        Procedure AddSharedLibrary(S : String);
@@ -106,7 +106,7 @@ Type
        Destructor Destroy;override;
        Function  MakeExecutable:boolean;override;
        Function  MakeSharedLibrary:boolean;override;
-       procedure AddExternalSymbol(const libname,symname:string);override;
+       procedure AddExternalSymbol(const libname,symname:string;ordnumber: longint);override;
      end;
 
 
@@ -312,9 +312,13 @@ procedure TLinker.AddProcdefImports(p:tnamedindexitem;arg:pointer);
 begin
   if tdef(p).deftype<>procdef then
     exit;
-  if assigned(tprocdef(p).import_dll) and
-     assigned(tprocdef(p).import_name) then
-    AddExternalSymbol(tprocdef(p).import_dll^,tprocdef(p).import_name^);
+  with tprocdef(p) do
+    if assigned(import_dll) then
+      if assigned(import_name) then
+        AddExternalSymbol(import_dll^,import_name^,-import_nr)
+      else
+        if import_nr<>0 then
+          AddExternalSymbol(import_dll^,import_dll^+'_index_'+tostr(import_nr),import_nr);
 end;
 
 
@@ -409,7 +413,7 @@ begin
 end;
 
 
-    procedure TLinker.AddExternalSymbol(const libname,symname:string);
+    procedure TLinker.AddExternalSymbol(const libname,symname:string;ordnumber: longint);
       begin
       end;
 
@@ -802,7 +806,7 @@ end;
       end;
 
 
-    procedure TInternalLinker.AddExternalSymbol(const libname,symname:string);
+    procedure TInternalLinker.AddExternalSymbol(const libname,symname:string;ordnumber: longint);
       var
         ExtLibrary : TExternalLibrary;
         ExtSymbol : TFPHashObject;
@@ -812,7 +816,7 @@ end;
           ExtLibrary:=TExternalLibrary.Create(ExternalLibraryList,libname);
         ExtSymbol:=TFPHashObject(ExtLibrary.ExternalSymbolList.Find(symname));
         if not assigned(ExtSymbol) then
-          ExtSymbol:=TFPHashObject.Create(ExtLibrary.ExternalSymbolList,symname);
+          ExtSymbol:=TExternalSymbol.Create(ExtLibrary.ExternalSymbolList,symname,ordnumber);
       end;
 
 

+ 19 - 0
compiler/ogbase.pas

@@ -348,6 +348,14 @@ interface
         destructor  destroy;override;
         property ExternalSymbolList:TFPHashObjectList read FExternalSymbolList;
       end;
+      
+      TExternalSymbol = class(TFPHashObject)
+      private
+        FOrdNumber: longint;
+      public
+        constructor create(AList: TFPHashObjectList; const AName: string; AOrdNumber: longint);
+        property OrdNumber: longint read FOrdNumber;
+      end;
 
       TExeOutput = class
       private
@@ -1296,6 +1304,17 @@ implementation
       end;
 
 
+{****************************************************************************
+                                TExternalSymbol
+****************************************************************************}
+
+constructor TExternalSymbol.create(AList: TFPHashObjectList; const AName: string; AOrdNumber: longint);
+begin
+  inherited Create(AList, AName);
+  FOrdNumber:=AOrdNumber;
+end;
+
+
 {****************************************************************************
                                 TExeOutput
 ****************************************************************************}

+ 31 - 9
compiler/ogcoff.pas

@@ -2338,7 +2338,7 @@ const pemagic : array[0..3] of byte = (
             internalobjdata.writebytes(emptyint,sizeof(emptyint));
         end;
 
-        function AddProcImport(const afuncname:string):TObjSymbol;
+        function AddProcImport(const afuncname:string; ordnumber:longint):TObjSymbol;
         const
 {$ifdef x86_64}
           jmpopcode : array[0..2] of byte = (
@@ -2366,6 +2366,7 @@ const pemagic : array[0..3] of byte = (
           emptyint : longint;
           secname,
           num : string;
+          ordnr: word;
         begin
           result:=nil;
           emptyint:=0;
@@ -2386,16 +2387,37 @@ const pemagic : array[0..3] of byte = (
           inc(idatalabnr);
           num:=tostr(idatalabnr);
           idata6label:=internalobjdata.SymbolDefine('__imp_'+num,AB_LOCAL,AT_DATA);
-          internalobjdata.writebytes(emptyint,2);
-          internalobjdata.writebytes(afuncname[1],length(afuncname));
+          ordnr:=Abs(ordnumber);
+          internalobjdata.writebytes(ordnr,2);
+          if ordnumber <= 0 then
+            internalobjdata.writebytes(afuncname[1],length(afuncname));
           internalobjdata.writebytes(emptyint,1);
           internalobjdata.writebytes(emptyint,align(internalobjdata.CurrObjSec.size,2)-internalobjdata.CurrObjSec.size);
           { idata4, import lookup table }
           internalobjdata.SetSection(idata4objsection);
           idata4label:=internalobjdata.SymbolDefine('__imp_lookup_'+num,AB_LOCAL,AT_DATA);
-          internalobjdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA);
-          if target_info.system=system_x86_64_win64 then
-            internalobjdata.writebytes(emptyint,sizeof(emptyint));
+          if ordnumber <= 0 then
+            begin
+              internalobjdata.writereloc(0,sizeof(longint),idata6label,RELOC_RVA);
+              if target_info.system=system_x86_64_win64 then
+                internalobjdata.writebytes(emptyint,sizeof(emptyint));
+            end
+          else
+            begin
+              emptyint:=ordnumber;
+              if target_info.system=system_x86_64_win64 then
+                begin
+                  internalobjdata.writebytes(emptyint,sizeof(emptyint));
+                  emptyint:=longint($80000000);
+                  internalobjdata.writebytes(emptyint,sizeof(emptyint));
+                end
+              else
+                begin
+                  emptyint:=emptyint or longint($80000000);
+                  internalobjdata.writebytes(emptyint,sizeof(emptyint));
+                end;
+              emptyint:=0;
+            end;
           { idata5, import address table }
           internalobjdata.SetSection(idata5objsection);
           { dummy back links }
@@ -2417,7 +2439,7 @@ const pemagic : array[0..3] of byte = (
       var
         i,j : longint;
         ExtLibrary : TExternalLibrary;
-        ExtSymbol  : TFPHashObject;
+        ExtSymbol  : TExternalSymbol;
         exesym     : TExeSymbol;
       begin
         for i:=0 to ExternalLibraryList.Count-1 do
@@ -2430,14 +2452,14 @@ const pemagic : array[0..3] of byte = (
             idata7objsection:=nil;
             for j:=0 to ExtLibrary.ExternalSymbolList.Count-1 do
               begin
-                ExtSymbol:=TFPHashObject(ExtLibrary.ExternalSymbolList[j]);
+                ExtSymbol:=TExternalSymbol(ExtLibrary.ExternalSymbolList[j]);
                 exesym:=TExeSymbol(ExeSymbolList.Find(ExtSymbol.Name));
                 if assigned(exesym) and
                    (exesym.State<>symstate_defined) then
                   begin
                     if not assigned(idata2objsection) then
                       StartImport(ExtLibrary.Name);
-                    exesym.objsymbol:=AddProcImport(ExtSymbol.Name);
+                    exesym.objsymbol:=AddProcImport(ExtSymbol.Name, ExtSymbol.OrdNumber);
                     exesym.State:=symstate_defined;
                   end;
               end;