mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
debug: load the macho unwind sections from the already-mapped image
This commit is contained in:
parent
618b0eb3d3
commit
2c76020e77
1 changed files with 18 additions and 25 deletions
|
|
@ -1259,24 +1259,7 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn
|
|||
.ncmds = hdr.ncmds,
|
||||
.buffer = mapped_mem[@sizeOf(macho.mach_header_64)..][0..hdr.sizeofcmds],
|
||||
};
|
||||
var unwind_info: ?[]const u8 = null;
|
||||
var eh_frame: ?[]const u8 = null;
|
||||
const symtab = while (it.next()) |cmd| switch (cmd.cmd()) {
|
||||
.SEGMENT_64 => {
|
||||
for (cmd.getSections()) |sect| {
|
||||
if (std.mem.eql(u8, "__TEXT", sect.segName())) {
|
||||
if (mem.eql(u8, "__unwind_info", sect.sectName())) {
|
||||
unwind_info = try chopSlice(mapped_mem, sect.offset, sect.size);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mem.eql(u8, "__eh_frame", sect.sectName())) {
|
||||
eh_frame = try chopSlice(mapped_mem, sect.offset, sect.size);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
.SYMTAB => break cmd.cast(macho.symtab_command).?,
|
||||
else => {},
|
||||
} else return error.MissingDebugInfo;
|
||||
|
|
@ -1386,8 +1369,6 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn
|
|||
.ofiles = ModuleDebugInfo.OFileTable.init(allocator),
|
||||
.symbols = symbols,
|
||||
.strings = strings,
|
||||
.unwind_info = unwind_info,
|
||||
.eh_frame = eh_frame,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -1602,19 +1583,28 @@ pub const DebugInfo = struct {
|
|||
)[0..header.sizeofcmds]),
|
||||
};
|
||||
|
||||
var unwind_info: ?[]const u8 = null;
|
||||
var eh_frame: ?[]const u8 = null;
|
||||
while (it.next()) |cmd| switch (cmd.cmd()) {
|
||||
.SEGMENT_64 => {
|
||||
const segment_cmd = cmd.cast(macho.segment_command_64).?;
|
||||
if (!mem.eql(u8, "__TEXT", segment_cmd.segName())) continue;
|
||||
|
||||
const original_address = address - vmaddr_slide;
|
||||
const seg_start = segment_cmd.vmaddr;
|
||||
const seg_start = segment_cmd.vmaddr + vmaddr_slide;
|
||||
const seg_end = seg_start + segment_cmd.vmsize;
|
||||
if (original_address >= seg_start and original_address < seg_end) {
|
||||
if (address >= seg_start and address < seg_end) {
|
||||
if (self.address_map.get(base_address)) |obj_di| {
|
||||
return obj_di;
|
||||
}
|
||||
|
||||
for (cmd.getSections()) |sect| {
|
||||
if (mem.eql(u8, "__unwind_info", sect.sectName())) {
|
||||
unwind_info = @as([*]const u8, @ptrFromInt(sect.addr + vmaddr_slide))[0..sect.size];
|
||||
} else if (mem.eql(u8, "__eh_frame", sect.sectName())) {
|
||||
eh_frame = @as([*]const u8, @ptrFromInt(sect.addr + vmaddr_slide))[0..sect.size];
|
||||
}
|
||||
}
|
||||
|
||||
const obj_di = try self.allocator.create(ModuleDebugInfo);
|
||||
errdefer self.allocator.destroy(obj_di);
|
||||
|
||||
|
|
@ -1628,6 +1618,8 @@ pub const DebugInfo = struct {
|
|||
obj_di.* = try readMachODebugInfo(self.allocator, macho_file);
|
||||
obj_di.base_address = base_address;
|
||||
obj_di.vmaddr_slide = vmaddr_slide;
|
||||
obj_di.unwind_info = unwind_info;
|
||||
obj_di.eh_frame = eh_frame;
|
||||
|
||||
try self.address_map.putNoClobber(base_address, obj_di);
|
||||
|
||||
|
|
@ -1932,9 +1924,10 @@ pub const ModuleDebugInfo = switch (native_os) {
|
|||
symbols: []const MachoSymbol,
|
||||
strings: [:0]const u8,
|
||||
ofiles: OFileTable,
|
||||
// Backed by mapped_memory
|
||||
unwind_info: ?[]const u8,
|
||||
eh_frame: ?[]const u8,
|
||||
|
||||
// Backed by the in-memory sections mapped by the loader
|
||||
unwind_info: ?[]const u8 = null,
|
||||
eh_frame: ?[]const u8 = null,
|
||||
|
||||
const OFileTable = std.StringHashMap(OFileInfo);
|
||||
const OFileInfo = struct {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue