mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-02 12:10:22 +02:00
+ 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:
parent
c781f21a46
commit
2bba4e2d44
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user