mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 13:09:16 +02:00
* try to fix cygwin import lib problem in internal linker
git-svn-id: trunk@7270 -
This commit is contained in:
parent
699e231223
commit
115d95004f
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user