* try to fix cygwin import lib problem in internal linker

git-svn-id: trunk@7270 -
This commit is contained in:
pierre 2007-05-04 22:49:56 +00:00
parent 699e231223
commit 115d95004f

View File

@ -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;