Răsfoiți Sursa

* try to fix cygwin import lib problem in internal linker

git-svn-id: trunk@7270 -
pierre 18 ani în urmă
părinte
comite
115d95004f
1 a modificat fișierele cu 86 adăugiri și 4 ștergeri
  1. 86 4
      compiler/ogbase.pas

+ 86 - 4
compiler/ogbase.pas

@@ -738,11 +738,84 @@ implementation
 
 
     function  TObjSection.FullName:string;
+      var
+        SecIdata2,
+        SecIdata4,
+        SecIData6,
+        SecIdata7: TObjSection;
+        p : pchar;
+        l,IData6Pos : longint;
+        Idata6Name,dllname : shortstring;
       begin
         if not assigned(FCachedFullName) then
           begin
             if assigned(ObjData) then
-              FCachedFullName:=stringdup(ObjData.Name+'('+Name+')')
+              begin
+                { C import libs are not yet ordered by import names
+                  and the objct name does not follow the same order
+                  as the import names, but idata$4 must be
+                  ordered alphabetically PM }
+                SecIdata2:=ObjData.findsection('.idata$2');
+                SecIdata4:=ObjData.findsection('.idata$4');
+                SecIdata6:=ObjData.findsection('.idata$6');
+                SecIdata7:=ObjData.findsection('.idata$7');
+                if (assigned(SecIdata7) and assigned(SecIdata4) and
+                     (Secidata4.Size=4)) or
+                   (assigned(SecIData2)) then
+                  begin
+                    if assigned(secidata6) then
+                      begin
+                        idata6Pos:=SecIdata6.Data.Pos;
+                        SecIdata6.Data.Seek(2);
+                        l:=idata6Pos-2;
+                        if l>255 then
+                          l:=255;
+                        IData6Name[0]:=chr(l);
+                        SecIdata6.Data.Read(IData6Name[1],l);
+                        SecIdata6.Data.Seek(idata6Pos);
+                      end
+                    else
+                      IData6Name:='<empty>';
+                    if assigned(SecIdata2) and
+                       (SecIdata2.ObjSymbolDefines.count=1) then
+                      begin
+                        dllname:=TObjSymbol(SecIdata2.ObjSymbolDefines.Last).name;
+                        if pos('__head_',dllname)=1 then
+                          dllname:=copy(dllname,8,length(dllname));
+                        while (pos('_',dllname)=1) do
+                          delete(dllname,1,1);
+                        dllname:=dllname+' head';
+                      end
+                    else if (SecIdata7.size=4) and
+                       (SecIdata7.ObjRelocations.count=1) and
+                       assigned(TObjRelocation(SecIdata7.ObjRelocations.Last).symbol) then
+                      begin
+                          dllname:=TObjRelocation(SecIdata7.ObjRelocations.Last).symbol.name;
+                        if pos('__head_',dllname)=1 then
+                          dllname:=copy(dllname,8,length(dllname));
+                        while (pos('_',dllname)=1) do
+                          delete(dllname,1,1);
+                        dllname:=dllname+' import';
+                      end
+                    else if (SecIdata7.ObjSymbolDefines.count=1) then
+                      begin
+                        dllname:=TObjSymbol(SecIdata7.ObjSymbolDefines.Last).name;
+                        if pos('_iname',dllname)>0 then
+                          dllname:=copy(dllname,1,pos('_iname',dllname)-1);
+                        while (pos('_',dllname)=1) do
+                          delete(dllname,1,1);
+                        dllname:=dllname+' tail';
+                      end
+                    else
+                      dllname:=ObjData.Name;
+                    FCachedFullName:=stringdup(dllName+'('+Idata6Name+')');
+                    if assigned(exemap) then
+                      exemap.Add(ObjData.Name+'('+Name+') replaced by '+
+                       FCachedFullName^);
+                  end
+                else
+                  FCachedFullName:=stringdup(ObjData.Name+'('+Name+')')
+              end
             else
               FCachedFullName:=stringdup(Name);
           end;
@@ -1631,7 +1704,7 @@ implementation
               end;
           end;
         { Sort list if needed }
-        if CurrExeSec.Name='.idata' then
+        if (CurrExeSec.Name='.idata') then
           TmpObjSectionList.Sort(@ObjSectionNameCompare);
         { Add the (sorted) list to the current ExeSection }
         for i:=0 to TmpObjSectionList.Count-1 do
@@ -1984,7 +2057,9 @@ implementation
                                 exemap.Add('');
                                 firstarchive:=false;
                               end;
-                            exemap.Add(StaticLibrary.ArReader.FileName+' - '+{exesym.ObjSymbol.ObjSection.FullName+}'('+exesym.Name+')');
+                            exemap.Add(StaticLibrary.ArReader.FileName+' - '+
+                              {exesym.ObjSymbol.ObjSection.FullName+}
+                              '('+exesym.Name+')');
                           end;
                         objinput:=StaticLibrary.ObjInputClass.Create;
                         objdata:=objinput.newObjData(StaticLibrary.ArReader.FileName);
@@ -2396,7 +2471,14 @@ implementation
           else
             internalerror(200603316);
           if assigned(exemap) then
-            exemap.Add('  References '+refobjsec.fullname);
+            begin
+              objsym:=objreloc.symbol;
+              if assigned(objsym) then
+                exemap.Add('  References  '+objsym.name+' in '
+                  +refobjsec.fullname)
+              else
+                exemap.Add('  References '+refobjsec.fullname);
+            end;
           AddToObjSectionWorkList(refobjsec);
         end;