+ Stabs debug info needs swapping when linking for different endianness.

* A few minor tweaks for Stabs generation.

git-svn-id: trunk@23316 -
This commit is contained in:
sergei 2013-01-05 12:26:23 +00:00
parent c781f21a46
commit 2bba4e2d44

View File

@ -627,6 +627,17 @@ implementation
result:=((v+a-1) div a) * a;
end;
procedure MaybeSwapStab(var v:TObjStabEntry);
begin
if source_info.endian<>target_info.endian then
begin
v.strpos:=SwapEndian(v.strpos);
v.nvalue:=SwapEndian(v.nvalue);
v.ndesc:=SwapEndian(v.ndesc);
end;
end;
{*****************************************************************************
TObjSymbol
*****************************************************************************}
@ -1275,19 +1286,14 @@ implementation
procedure TObjData.beforewrite;
var
s : string[1];
hstab : TObjStabEntry;
begin
{ create stabs sections if debugging }
if assigned(StabsSec) then
begin
{ Create dummy HdrSym stab, it will be overwritten in AfterWrite }
fillchar(hstab,sizeof(hstab),0);
StabsSec.Write(hstab,sizeof(hstab));
StabsSec.WriteZeros(sizeof(TObjStabEntry));
{ start of stabstr }
s:=#0;
StabStrSec.write(s[1],length(s));
StabStrSec.writeZeros(1);
end;
end;
@ -1300,7 +1306,6 @@ implementation
procedure TObjData.afterwrite;
var
s : string[1];
hstab : TObjStabEntry;
begin
FObjSectionList.ForEachCall(@section_afterwrite,nil);
@ -1309,14 +1314,14 @@ implementation
if assigned(StabsSec) then
begin
{ end of stabstr }
s:=#0;
StabStrSec.write(s[1],length(s));
StabStrSec.writeZeros(1);
{ header stab }
hstab.strpos:=1;
hstab.ntype:=0;
hstab.nother:=0;
hstab.ndesc:=(StabsSec.Size div sizeof(TObjStabEntry))-1;
hstab.nvalue:=StabStrSec.Size;
MaybeSwapStab(hstab);
StabsSec.Data.seek(0);
StabsSec.Data.write(hstab,sizeof(hstab));
end;
@ -2764,8 +2769,7 @@ implementation
mergedstabstrsec:=internalObjData.CreateSection(sec_stabstr,'');
{ write stab for hdrsym }
fillchar(hstab,sizeof(TObjStabEntry),0);
mergedstabsec.write(hstab,sizeof(TObjStabEntry));
mergedstabsec.writeZeros(sizeof(TObjStabEntry));
mergestabcnt:=1;
{ .stabstr starts with a #0 }
@ -2788,6 +2792,7 @@ implementation
hstabreloc:=nil;
skipstab:=false;
currstabsec.Data.read(hstab,sizeof(TObjStabEntry));
MaybeSwapStab(hstab);
{ Only include first hdrsym stab }
if hstab.ntype=0 then
skipstab:=true;
@ -2868,6 +2873,7 @@ implementation
mergedstabsec.ObjRelocations.Add(hstabreloc);
end;
{ Write updated stab }
MaybeSwapStab(hstab);
mergedstabsec.write(hstab,sizeof(hstab));
inc(mergestabcnt);
end;
@ -2892,6 +2898,7 @@ implementation
hstab.nother:=0;
hstab.ndesc:=word(mergestabcnt-1);
hstab.nvalue:=mergedstabstrsec.Size;
MaybeSwapStab(hstab);
mergedstabsec.Data.seek(0);
mergedstabsec.Data.write(hstab,sizeof(hstab));
end;