|
@@ -740,11 +740,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;
|
|
@@ -1633,7 +1706,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
|
|
@@ -1986,7 +2059,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);
|
|
@@ -2398,7 +2473,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;
|
|
|
|