mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 12:29:29 +02:00
LazDebuggerFp (pure): Read macho-64 binaries
git-svn-id: trunk@45173 -
This commit is contained in:
parent
333e535ec6
commit
f81a1f3ea6
@ -202,6 +202,7 @@ type
|
||||
|
||||
TDbgInstance = class(TObject)
|
||||
private
|
||||
FMode: TFPDMode;
|
||||
FName: String;
|
||||
FOnDebugInfoLoaded: TNotifyEvent;
|
||||
FProcess: TDbgProcess;
|
||||
@ -226,6 +227,7 @@ type
|
||||
property DbgInfo: TDbgInfo read FDbgInfo;
|
||||
property SymbolTableInfo: TFpSymbolInfo read FSymbolTableInfo;
|
||||
property OnDebugInfoLoaded: TNotifyEvent read FOnDebugInfoLoaded write FOnDebugInfoLoaded;
|
||||
property Mode: TFPDMode read FMode;
|
||||
end;
|
||||
|
||||
{ TDbgLibrary }
|
||||
@ -620,6 +622,10 @@ end;
|
||||
procedure TDbgInstance.LoadInfo;
|
||||
begin
|
||||
FLoader := InitializeLoader;
|
||||
if FLoader.Image64Bit then
|
||||
FMode:=dm64
|
||||
else
|
||||
FMode:=dm32;
|
||||
FDbgInfo := TFpDwarfInfo.Create(FLoader);
|
||||
TFpDwarfInfo(FDbgInfo).LoadCompilationUnits;
|
||||
FSymbolTableInfo := TFpSymbolInfo.Create(FLoader);
|
||||
|
@ -56,12 +56,11 @@ type
|
||||
private
|
||||
FFileLoader: TDbgFileLoader;
|
||||
FImgReader: TDbgImageReader;
|
||||
function GetImage64Bit: Boolean;
|
||||
protected
|
||||
FImage64Bit: Boolean unimplemented;
|
||||
FImageBase: QWord unimplemented;
|
||||
function GetSection(const AName: String): PDbgImageSection; virtual;
|
||||
//procedure SetImageBase(ABase: QWord);
|
||||
//procedure SetImage64Bit(AValue: Boolean);
|
||||
property ImgReader: TDbgImageReader read FImgReader write FImgReader;
|
||||
public
|
||||
constructor Create; virtual;
|
||||
@ -73,7 +72,7 @@ type
|
||||
destructor Destroy; override;
|
||||
function IsValid: Boolean;
|
||||
property ImageBase: QWord read FImageBase; unimplemented;
|
||||
Property Image64Bit: Boolean read FImage64Bit; unimplemented;
|
||||
Property Image64Bit: Boolean read GetImage64Bit;
|
||||
property Section[const AName: String]: PDbgImageSection read GetSection;
|
||||
end;
|
||||
|
||||
@ -83,6 +82,18 @@ implementation
|
||||
|
||||
{ TDbgImageLoader }
|
||||
|
||||
function TDbgImageLoader.GetImage64Bit: Boolean;
|
||||
begin
|
||||
if not assigned(ImgReader) then
|
||||
{$ifdef cpui386}
|
||||
result := false
|
||||
{$else}
|
||||
result := true
|
||||
{$endif}
|
||||
else
|
||||
result := ImgReader.Image64Bit;
|
||||
end;
|
||||
|
||||
function TDbgImageLoader.GetSection(const AName: String): PDbgImageSection;
|
||||
begin
|
||||
if FImgReader <> nil then
|
||||
|
@ -57,10 +57,10 @@ begin
|
||||
try
|
||||
Result := Assigned(ASource);
|
||||
if not Result then Exit;
|
||||
//Result := stream.Read(header, sizeof(header)) = sizeof(header);
|
||||
Result := ASource.Read(0, sizeof(header), @header) = sizeof(header);
|
||||
if not Result then Exit;
|
||||
Result := (header.magic = MH_CIGAM) or (header.magic = MH_MAGIC);
|
||||
Result := (header.magic = MH_CIGAM) or (header.magic = MH_MAGIC) or
|
||||
(header.magic = MH_CIGAM_64) or (header.magic = MH_MAGIC_64);
|
||||
except
|
||||
Result := false;
|
||||
end;
|
||||
@ -133,6 +133,7 @@ begin
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
SetImage64Bit((fFile.header.cputype and CPU_ARCH_ABI64)=CPU_ARCH_ABI64);
|
||||
fileRead := true;
|
||||
end;
|
||||
|
||||
|
@ -55,17 +55,23 @@ var
|
||||
i : Integer;
|
||||
j : Integer;
|
||||
ofs : Integer;
|
||||
sc : psection;
|
||||
sc32: psection;
|
||||
sc64: psection_64;
|
||||
s : TMachOsection;
|
||||
hs : integer;
|
||||
i64 : boolean;
|
||||
begin
|
||||
//Stream.Read(header, sizeof(header));
|
||||
Result := ALoader.Read(0, sizeof(header), @header) = sizeof(header);
|
||||
if not Result then Exit;
|
||||
Result := (header.magic = MH_MAGIC) or (header.magic = MH_CIGAM);
|
||||
i64 := (header.magic = MH_CIGAM_64) or (header.magic = MH_MAGIC_64);
|
||||
Result := (header.magic = MH_MAGIC) or (header.magic = MH_CIGAM) or i64;
|
||||
|
||||
if i64 then
|
||||
hs := sizeof(mach_header_64)
|
||||
else
|
||||
hs := SizeOf(mach_header);
|
||||
SetLength(cmdbuf, header.sizeofcmds);
|
||||
//Stream.Read(cmdbuf[0], header.sizeofcmds);
|
||||
ALoader.Read(sizeof(header), header.sizeofcmds, @cmdbuf[0]);
|
||||
ALoader.Read(hs, header.sizeofcmds, @cmdbuf[0]);
|
||||
|
||||
SetLength(commands, header.ncmds);
|
||||
ofs := 0;
|
||||
@ -73,13 +79,23 @@ begin
|
||||
commands[i] := @cmdbuf[ofs];
|
||||
|
||||
if commands[i]^.cmd = LC_SEGMENT then begin
|
||||
sc := @cmdbuf[ofs+sizeof(segment_command)];
|
||||
sc32 := @cmdbuf[ofs+sizeof(segment_command)];
|
||||
for j := 0 to psegment_command(commands[i])^.nsects- 1 do begin
|
||||
s := TMachOSection.Create;
|
||||
s.is32:=true;
|
||||
s.sec32:=sc^;
|
||||
s.sec32:=sc32^;
|
||||
sections.add(s);
|
||||
inc(sc);
|
||||
inc(sc32);
|
||||
end;
|
||||
end
|
||||
else if commands[i]^.cmd = LC_SEGMENT_64 then begin
|
||||
sc64 := @cmdbuf[ofs+sizeof(segment_command_64)];
|
||||
for j := 0 to psegment_command_64(commands[i])^.nsects- 1 do begin
|
||||
s := TMachOSection.Create;
|
||||
s.is32:=False;
|
||||
s.sec64:=sc64^;
|
||||
sections.add(s);
|
||||
inc(sc64);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
@ -390,6 +390,7 @@ type
|
||||
reserved2 : uint32_t; { reserved (for count or sizeof) }
|
||||
reserved3 : uint32_t; { reserved }
|
||||
end;
|
||||
psection_64 = ^section_64;
|
||||
|
||||
{* The flags field of a section structure is separated into two parts a section
|
||||
* type and section attributes. The section types are mutually exclusive (it
|
||||
@ -1138,6 +1139,24 @@ const
|
||||
FAT_MAGIC = $cafebabe;
|
||||
FAT_CIGAM = $bebafeca;
|
||||
|
||||
const
|
||||
CPU_ARCH_MASK = $ff000000; { mask for architecture bits }
|
||||
CPU_ARCH_ABI64 = $01000000; { 64 bit ABI }
|
||||
|
||||
CPU_TYPE_VAX = 1;
|
||||
CPU_TYPE_MC680x0 = 6;
|
||||
CPU_TYPE_X86 = 7;
|
||||
CPU_TYPE_I386 = CPU_TYPE_X86;
|
||||
CPU_TYPE_X86_64 = CPU_TYPE_X86 and CPU_ARCH_ABI64;
|
||||
CPU_TYPE_MC98000 = 10;
|
||||
CPU_TYPE_HPPA = 11;
|
||||
CPU_TYPE_ARM = 12;
|
||||
CPU_TYPE_MC88000 = 13;
|
||||
CPU_TYPE_SPARC = 14;
|
||||
CPU_TYPE_I860 = 15;
|
||||
CPU_TYPE_POWERPC = 18;
|
||||
CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC and CPU_ARCH_ABI64;
|
||||
|
||||
type
|
||||
fat_header = record
|
||||
magic : uint32_t; { FAT_MAGIC }
|
||||
|
Loading…
Reference in New Issue
Block a user