FpDebug: Don't read debug info with unknown DW_FORM

This commit is contained in:
Martin 2024-01-16 16:26:20 +01:00
parent c9cb29b47a
commit 532aae6212
2 changed files with 20 additions and 1 deletions

View File

@ -223,6 +223,8 @@ const
DW_FORM_ref_udata = $15; // reference DW_FORM_ref_udata = $15; // reference
DW_FORM_indirect = $16; // DW_FORM_indirect = $16; //
DW_FORM_MAX = $16; //
{ DWARF operation encodings } { DWARF operation encodings }

View File

@ -215,6 +215,7 @@ type
FMap: TMap; // Abbrevs FMap: TMap; // Abbrevs
{$Endif} {$Endif}
FDefinitions: array of TDwarfAbbrevEntry; FDefinitions: array of TDwarfAbbrevEntry;
FValid: Boolean;
function GetEntryPointer(AIndex: Integer): PDwarfAbbrevEntry; inline; function GetEntryPointer(AIndex: Integer): PDwarfAbbrevEntry; inline;
procedure LoadAbbrevs(AnAbbrevDataPtr: Pointer); procedure LoadAbbrevs(AnAbbrevDataPtr: Pointer);
public public
@ -224,6 +225,7 @@ type
function FindLe128bFromPointer(AnAbbrevPtr: Pointer; out AData: TDwarfAbbrev{Pointer}): Pointer; reintroduce; function FindLe128bFromPointer(AnAbbrevPtr: Pointer; out AData: TDwarfAbbrev{Pointer}): Pointer; reintroduce;
{$Endif} {$Endif}
property EntryPointer[AIndex: Integer]: PDwarfAbbrevEntry read GetEntryPointer; property EntryPointer[AIndex: Integer]: PDwarfAbbrevEntry read GetEntryPointer;
property Valid: Boolean read FValid;
end; end;
{%endregion Abbreviation Data / Section "debug_abbrev"} {%endregion Abbreviation Data / Section "debug_abbrev"}
@ -1560,6 +1562,7 @@ var
DbgVerbose: Boolean; DbgVerbose: Boolean;
f: TDwarfAbbrevFlags; f: TDwarfAbbrevFlags;
begin begin
FValid := False;
abbrev := 0; abbrev := 0;
CurAbbrevIndex := 0; CurAbbrevIndex := 0;
DbgVerbose := (FPDBG_DWARF_VERBOSE_LOAD <> nil) and (FPDBG_DWARF_VERBOSE_LOAD^.Enabled); DbgVerbose := (FPDBG_DWARF_VERBOSE_LOAD <> nil) and (FPDBG_DWARF_VERBOSE_LOAD^.Enabled);
@ -1616,6 +1619,10 @@ begin
Include(f, dafHasAbstractOrigin); Include(f, dafHasAbstractOrigin);
form := ULEB128toOrdinal(pbyte(AnAbbrevDataPtr)); form := ULEB128toOrdinal(pbyte(AnAbbrevDataPtr));
if form > DW_FORM_MAX then begin
DebugLn(FPDBG_DWARF_WARNINGS, ['Unknown FW_FORM: ', form, ' found. Aborting']);
exit;
end;
MakeRoom(CurAbbrevIndex + 1); MakeRoom(CurAbbrevIndex + 1);
FDefinitions[CurAbbrevIndex].Attribute := attrib; FDefinitions[CurAbbrevIndex].Attribute := attrib;
@ -1636,6 +1643,7 @@ begin
Inc(pword(AnAbbrevDataPtr)); Inc(pword(AnAbbrevDataPtr));
end; end;
FValid := True;
end; end;
constructor TDwarfAbbrevList.Create(AnAbbrData, AnAbbrDataEnd: Pointer; AnAbbrevOffset, constructor TDwarfAbbrevList.Create(AnAbbrData, AnAbbrDataEnd: Pointer; AnAbbrevOffset,
@ -4245,7 +4253,8 @@ begin
Result := FCompilationUnits.Count; Result := FCompilationUnits.Count;
for i := 0 to Result - 1 do for i := 0 to Result - 1 do
TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker.MarkReadyToRun; if TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker <> nil then
TDwarfCompilationUnit(FCompilationUnits[i]).FComputeNameHashesWorker.MarkReadyToRun;
end; end;
function TFpDwarfInfo.CompilationUnitForAddr(AnAddr: TDBGPtr function TFpDwarfInfo.CompilationUnitForAddr(AnAddr: TDBGPtr
@ -5060,6 +5069,11 @@ begin
FFirstScope.Init(nil); // invalid FFirstScope.Init(nil); // invalid
if not FAbbrevList.Valid then begin
FDwarfSymbolClassMap := DwarfSymbolClassMapList.FDefaultMap.Create(Self, nil);
exit;
end;
FComputeNameHashesWorker := TFpThreadWorkerComputeNameHashes.Create(Self); FComputeNameHashesWorker := TFpThreadWorkerComputeNameHashes.Create(Self);
FComputeNameHashesWorker.AddRef; FComputeNameHashesWorker.AddRef;
FScanAllWorker := TFpThreadWorkerScanAll.Create(Self, FComputeNameHashesWorker); FScanAllWorker := TFpThreadWorkerScanAll.Create(Self, FComputeNameHashesWorker);
@ -5068,6 +5082,7 @@ begin
Scope := FScanAllWorker.FindCompileUnit(FScopeList); Scope := FScanAllWorker.FindCompileUnit(FScopeList);
if not Scope.IsValid then begin if not Scope.IsValid then begin
DebugLn(FPDBG_DWARF_WARNINGS, ['WARNING compilation unit has no compile_unit tag']); DebugLn(FPDBG_DWARF_WARNINGS, ['WARNING compilation unit has no compile_unit tag']);
FDwarfSymbolClassMap := DwarfSymbolClassMapList.FDefaultMap.Create(Self, nil);
Exit; Exit;
end; end;
FValid := True; FValid := True;
@ -5131,6 +5146,8 @@ destructor TDwarfCompilationUnit.Destroy;
var var
n: Integer; n: Integer;
begin begin
if FLineNumberMap = nil then
exit;
for n := 0 to FLineNumberMap.Count - 1 do for n := 0 to FLineNumberMap.Count - 1 do
Dispose(PDWarfLineMap(FLineNumberMap.Objects[n])); Dispose(PDWarfLineMap(FLineNumberMap.Objects[n]));
FreeAndNil(FLineNumberMap); FreeAndNil(FLineNumberMap);