Procházet zdrojové kódy

* Propagate AS_NEEDED flag further into Load_DynamicObject and handle it properly: shared objects marked with AS_NEEDED are added to dependencies only if they actually resolve some symbol.
* Dropped TObjInput.newObjData method. Instead, TObjData instances are created directly in ReadObjData, this gives possibility to create a different type of TObjData based on file header.
- Dropped TObjInput destructor, it does nothing except calling inherited.

git-svn-id: trunk@23118 -

sergei před 12 roky
rodič
revize
36859068f5
4 změnil soubory, kde provedl 19 přidání a 29 odebrání
  1. 0 2
      compiler/link.pas
  2. 4 19
      compiler/ogbase.pas
  3. 3 2
      compiler/ogcoff.pas
  4. 12 6
      compiler/ogelf.pas

+ 0 - 2
compiler/link.pas

@@ -1004,7 +1004,6 @@ Implementation
         fn:=FindObjectFile(para,'',false);
         Comment(V_Tried,'Reading object '+fn);
         objinput:=CObjInput.Create;
-        objdata:=objinput.newObjData(para);
         objreader:=TObjectreader.create;
         if objreader.openfile(fn) then
           begin
@@ -1038,7 +1037,6 @@ Implementation
             begin
               { may be a regular object as well as a dynamic one }
               objinput:=CObjInput.Create;
-              objdata:=objinput.newObjData(para);
               if objinput.ReadObjData(objreader,objdata) then
                 begin
                   stmt:=TStaticLibrary.create_object(objdata);

+ 4 - 19
compiler/ogbase.pas

@@ -350,9 +350,7 @@ interface
         procedure ReadSectionContent(Data:TObjData);
       public
         constructor create;virtual;
-        destructor  destroy;override;
-        function  newObjData(const n:string):TObjData;
-        function  ReadObjData(AReader:TObjectreader;Data:TObjData):boolean;virtual;abstract;
+        function  ReadObjData(AReader:TObjectreader;out Data:TObjData):boolean;virtual;abstract;
         class function CanReadObjData(AReader:TObjectreader):boolean;virtual;
         procedure inputerror(const s : string);
       end;
@@ -522,7 +520,7 @@ interface
         procedure Load_ProvideSymbol(const aname:string);virtual;
         procedure Load_IsSharedLibrary;
         procedure Load_ImageBase(const avalue:string);
-        procedure Load_DynamicObject(ObjData:TObjData);virtual;
+        procedure Load_DynamicObject(ObjData:TObjData;asneeded:boolean);virtual;
         procedure Order_Start;virtual;
         procedure Order_End;virtual;
         procedure Order_ExeSection(const aname:string);virtual;
@@ -1815,7 +1813,7 @@ implementation
       end;
 
 
-    procedure TExeOutput.Load_DynamicObject(ObjData:TObjData);
+    procedure TExeOutput.Load_DynamicObject(ObjData:TObjData;asneeded:boolean);
       begin
       end;
 
@@ -2410,7 +2408,6 @@ implementation
                                     '('+exesym.Name+')');
                                 end;
                               objinput:=lib.ObjInputClass.Create;
-                              objdata:=objinput.newObjData(lib.ArReader.FileName);
                               objinput.ReadObjData(lib.ArReader,objdata);
                               objinput.free;
                               AddObjData(objdata);
@@ -2436,7 +2433,7 @@ implementation
               lkObject:
                 { TODO: ownership of objdata }
                 //if lib.objdata.is_dynamic then
-                  Load_DynamicObject(lib.objdata);
+                  Load_DynamicObject(lib.objdata,lib.AsNeeded);
                 {else
                   begin
                     AddObjData(lib.objdata);
@@ -3250,18 +3247,6 @@ implementation
       end;
 
 
-    destructor TObjInput.destroy;
-      begin
-        inherited destroy;
-      end;
-
-
-    function TObjInput.newObjData(const n:string):TObjData;
-      begin
-        result:=CObjData.create(n);
-      end;
-
-
     procedure TObjInput.inputerror(const s : string);
       begin
         Comment(V_Error,s+' while reading '+InputFileName);

+ 3 - 2
compiler/ogcoff.pas

@@ -179,7 +179,7 @@ interface
        public
          constructor createcoff(awin32:boolean);
          destructor destroy;override;
-         function  ReadObjData(AReader:TObjectreader;objdata:TObjData):boolean;override;
+         function  ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
        end;
 
        TDJCoffObjInput = class(TCoffObjInput)
@@ -1750,7 +1750,7 @@ const pemagic : array[0..3] of byte = (
       end;
 
 
-    function  TCoffObjInput.ReadObjData(AReader:TObjectreader;objdata:TObjData):boolean;
+    function  TCoffObjInput.ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;
       var
         secalign : shortint;
         strpos,
@@ -1765,6 +1765,7 @@ const pemagic : array[0..3] of byte = (
       begin
         FReader:=AReader;
         InputFileName:=AReader.FileName;
+        objdata:=CObjData.Create(InputFileName);
         result:=false;
         FCoffSyms:=TDynamicArray.Create(SymbolMaxGrow);
         with TCoffObjData(objdata) do

+ 12 - 6
compiler/ogelf.pas

@@ -140,7 +140,7 @@ interface
        public
          constructor Create;override;
          destructor Destroy;override;
-         function  ReadObjData(AReader:TObjectreader;objdata:TObjData):boolean;override;
+         function  ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
          class function CanReadObjData(AReader:TObjectreader):boolean;override;
        end;
 
@@ -254,7 +254,7 @@ interface
          constructor Create;override;
          destructor Destroy;override;
          procedure Load_Start;override;
-         procedure Load_DynamicObject(ObjData:TObjData);override;
+         procedure Load_DynamicObject(ObjData:TObjData;asneeded:boolean);override;
          procedure Order_Start;override;
          procedure Order_end;override;
          procedure AfterUnusedSectionRemoval;override;
@@ -1506,7 +1506,7 @@ implementation
       end;
 
 
-    function TElfObjInput.ReadObjData(AReader:TObjectreader;objdata:TObjData):boolean;
+    function TElfObjInput.ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;
       var
         i,j,strndx,dynndx,
         versymndx,verdefndx,verneedndx: longint;
@@ -1532,6 +1532,8 @@ implementation
         if shentsize<>sizeof(TElfsechdr) then
           InternalError(2012062701);
 
+        objdata:=CObjData.Create(InputFilename);
+
         FSecTbl:=AllocMem(nsects*sizeof(TSectionRec));
         FLoaded:=AllocMem(nsects*sizeof(boolean));
         SetLength(shdrs,nsects);
@@ -2063,15 +2065,15 @@ implementation
       end;
 
 
-    procedure TElfExeOutput.Load_DynamicObject(objdata:TObjData);
+    procedure TElfExeOutput.Load_DynamicObject(objdata:TObjData;asneeded:boolean);
       var
         i: longint;
         exesym: TExeSymbol;
         objsym: TObjSymbol;
+        needed: boolean;
       begin
         Comment(v_debug,'Dynamic object: '+objdata.name);
-        if neededlist.Find(objdata.name)=nil then
-          neededlist.Add(objdata.name,objdata);
+        needed:=false;
         for i:=0 to UnresolvedExeSymbols.Count-1 do
           begin
             exesym:=TExeSymbol(UnresolvedExeSymbols[i]);
@@ -2082,8 +2084,12 @@ implementation
               begin
                 exesym.State:=symstate_defined;
                 exesym.dynindex:=dynsymlist.Add(exesym)+1;
+                needed:=true;
               end;
           end;
+        if (needed or (not asneeded)) and
+          (neededlist.Find(objdata.name)=nil) then
+          neededlist.Add(objdata.name,objdata);
       end;