mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
FIX: Read debug line info from 64 bit Mac OS X binary
This commit is contained in:
parent
91bc94c7f1
commit
6ffc40ad78
2 changed files with 16 additions and 9 deletions
|
|
@ -61,7 +61,7 @@
|
|||
{$longstrings on}
|
||||
{$codepage utf-8}
|
||||
{$coperators on}
|
||||
{$pointermath on}
|
||||
{$pointermath on}
|
||||
|
||||
{.$DEFINE DEBUG_DWARF_PARSER}
|
||||
|
||||
|
|
@ -255,8 +255,10 @@ begin
|
|||
dladdr(addr, @dlinfo);
|
||||
baseaddr:= dlinfo.dli_fbase;
|
||||
filename:= String(dlinfo.dli_fname);
|
||||
{$if not defined(darwin)}
|
||||
if ExtractFileName(filename) = ExtractFileName(ParamStr(0))
|
||||
then baseaddr:= nil;
|
||||
{$endif}
|
||||
end;
|
||||
{$else}
|
||||
var
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ const
|
|||
DwarfZDebugLine: shortstring = '.zdebug_line';
|
||||
DwarfDarwinDebugLine: shortstring = '__debug_line';
|
||||
DwarfDarwinSegmentName: shortstring = '__DWARF';
|
||||
TextDarwinSegmentName: shortstring = '__TEXT';
|
||||
|
||||
type
|
||||
TCheckResult = (header_not_found, header_invalid, no_debug_info, found_debug_info);
|
||||
|
|
@ -665,8 +666,11 @@ begin
|
|||
Exit(false);
|
||||
end;
|
||||
|
||||
if segment_header.segname <> DwarfDarwinSegmentName then
|
||||
f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent)
|
||||
if segment_header.segname <> DwarfDarwinSegmentName then begin
|
||||
f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent);
|
||||
if segment_header.segname = TextDarwinSegmentName then
|
||||
Imagebase:= segment_header.vmaddr;
|
||||
end
|
||||
else begin
|
||||
for J:= 0 to segment_header.nsects - 1 do begin
|
||||
if (f.Read(section_header, sizeof(section_header)) <> sizeof(section_header)) then begin
|
||||
|
|
@ -739,8 +743,11 @@ begin
|
|||
Exit(false);
|
||||
end;
|
||||
|
||||
if segment_header.segname <> DwarfDarwinSegmentName then
|
||||
f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent)
|
||||
if segment_header.segname <> DwarfDarwinSegmentName then begin
|
||||
f.Seek(load_command.cmdsize - sizeof(segment_header), soFromCurrent);
|
||||
if segment_header.segname = TextDarwinSegmentName then
|
||||
Imagebase:= segment_header.vmaddr;
|
||||
end
|
||||
else begin
|
||||
for J:= 0 to segment_header.nsects - 1 do begin
|
||||
if (f.Read(section_header, sizeof(section_header)) <> sizeof(section_header)) then begin
|
||||
|
|
@ -971,7 +978,7 @@ begin
|
|||
MH_MAGIC,
|
||||
MH_CIGAM:
|
||||
begin
|
||||
DEBUG_WRITELN('Found Unix Mach-O 32-bit header.');
|
||||
DEBUG_WRITELN('Found Darwin Mach-O 32-bit header.');
|
||||
|
||||
if ExtractMacho32(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then
|
||||
Result := found_debug_info
|
||||
|
|
@ -981,7 +988,7 @@ begin
|
|||
MH_MAGIC_64,
|
||||
MH_CIGAM_64:
|
||||
begin
|
||||
DEBUG_WRITELN('Found Unix Mach-O 64-bit header.');
|
||||
DEBUG_WRITELN('Found Darwin Mach-O 64-bit header.');
|
||||
|
||||
if ExtractMacho64(f, DwarfLineInfoSize, DwarfLineInfoOffset, Imagebase, IsCompressed) then
|
||||
Result := found_debug_info
|
||||
|
|
@ -993,8 +1000,6 @@ begin
|
|||
Exit(header_not_found);
|
||||
end;
|
||||
end;
|
||||
|
||||
Imagebase:= 0;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue