| ... | @@ -1259,24 +1259,7 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn | ... | @@ -1259,24 +1259,7 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn |
| 1259 | .ncmds = hdr.ncmds, | 1259 | .ncmds = hdr.ncmds, |
| 1260 | .buffer = mapped_mem[@sizeOf(macho.mach_header_64)..][0..hdr.sizeofcmds], | 1260 | .buffer = mapped_mem[@sizeOf(macho.mach_header_64)..][0..hdr.sizeofcmds], |
| 1261 | }; | 1261 | }; |
| 1262 | var unwind_info: ?[]const u8 = null; | | |
| 1263 | var eh_frame: ?[]const u8 = null; | | |
| 1264 | const symtab = while (it.next()) |cmd| switch (cmd.cmd()) { | 1262 | const symtab = while (it.next()) |cmd| switch (cmd.cmd()) { |
| 1265 | .SEGMENT_64 => { | | |
| 1266 | for (cmd.getSections()) |sect| { | | |
| 1267 | if (std.mem.eql(u8, "__TEXT", sect.segName())) { | | |
| 1268 | if (mem.eql(u8, "__unwind_info", sect.sectName())) { | | |
| 1269 | unwind_info = try chopSlice(mapped_mem, sect.offset, sect.size); | | |
| 1270 | continue; | | |
| 1271 | } | | |
| 1272 | | | |
| 1273 | if (mem.eql(u8, "__eh_frame", sect.sectName())) { | | |
| 1274 | eh_frame = try chopSlice(mapped_mem, sect.offset, sect.size); | | |
| 1275 | continue; | | |
| 1276 | } | | |
| 1277 | } | | |
| 1278 | } | | |
| 1279 | }, | | |
| 1280 | .SYMTAB => break cmd.cast(macho.symtab_command).?, | 1263 | .SYMTAB => break cmd.cast(macho.symtab_command).?, |
| 1281 | else => {}, | 1264 | else => {}, |
| 1282 | } else return error.MissingDebugInfo; | 1265 | } else return error.MissingDebugInfo; |
| ... | @@ -1386,8 +1369,6 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn | ... | @@ -1386,8 +1369,6 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn |
| 1386 | .ofiles = ModuleDebugInfo.OFileTable.init(allocator), | 1369 | .ofiles = ModuleDebugInfo.OFileTable.init(allocator), |
| 1387 | .symbols = symbols, | 1370 | .symbols = symbols, |
| 1388 | .strings = strings, | 1371 | .strings = strings, |
| 1389 | .unwind_info = unwind_info, | | |
| 1390 | .eh_frame = eh_frame, | | |
| 1391 | }; | 1372 | }; |
| 1392 | } | 1373 | } |
| 1393 | | 1374 | |
| ... | @@ -1602,19 +1583,28 @@ pub const DebugInfo = struct { | ... | @@ -1602,19 +1583,28 @@ pub const DebugInfo = struct { |
| 1602 | )[0..header.sizeofcmds]), | 1583 | )[0..header.sizeofcmds]), |
| 1603 | }; | 1584 | }; |
| 1604 | | 1585 | |
| | 1586 | var unwind_info: ?[]const u8 = null; |
| | 1587 | var eh_frame: ?[]const u8 = null; |
| 1605 | while (it.next()) |cmd| switch (cmd.cmd()) { | 1588 | while (it.next()) |cmd| switch (cmd.cmd()) { |
| 1606 | .SEGMENT_64 => { | 1589 | .SEGMENT_64 => { |
| 1607 | const segment_cmd = cmd.cast(macho.segment_command_64).?; | 1590 | const segment_cmd = cmd.cast(macho.segment_command_64).?; |
| 1608 | if (!mem.eql(u8, "__TEXT", segment_cmd.segName())) continue; | 1591 | if (!mem.eql(u8, "__TEXT", segment_cmd.segName())) continue; |
| 1609 | | 1592 | |
| 1610 | const original_address = address - vmaddr_slide; | 1593 | const seg_start = segment_cmd.vmaddr + vmaddr_slide; |
| 1611 | const seg_start = segment_cmd.vmaddr; | | |
| 1612 | const seg_end = seg_start + segment_cmd.vmsize; | 1594 | const seg_end = seg_start + segment_cmd.vmsize; |
| 1613 | if (original_address >= seg_start and original_address < seg_end) { | 1595 | if (address >= seg_start and address < seg_end) { |
| 1614 | if (self.address_map.get(base_address)) |obj_di| { | 1596 | if (self.address_map.get(base_address)) |obj_di| { |
| 1615 | return obj_di; | 1597 | return obj_di; |
| 1616 | } | 1598 | } |
| 1617 | | 1599 | |
| | 1600 | for (cmd.getSections()) |sect| { |
| | 1601 | if (mem.eql(u8, "__unwind_info", sect.sectName())) { |
| | 1602 | unwind_info = @as([*]const u8, @ptrFromInt(sect.addr + vmaddr_slide))[0..sect.size]; |
| | 1603 | } else if (mem.eql(u8, "__eh_frame", sect.sectName())) { |
| | 1604 | eh_frame = @as([*]const u8, @ptrFromInt(sect.addr + vmaddr_slide))[0..sect.size]; |
| | 1605 | } |
| | 1606 | } |
| | 1607 | |
| 1618 | const obj_di = try self.allocator.create(ModuleDebugInfo); | 1608 | const obj_di = try self.allocator.create(ModuleDebugInfo); |
| 1619 | errdefer self.allocator.destroy(obj_di); | 1609 | errdefer self.allocator.destroy(obj_di); |
| 1620 | | 1610 | |
| ... | @@ -1628,6 +1618,8 @@ pub const DebugInfo = struct { | ... | @@ -1628,6 +1618,8 @@ pub const DebugInfo = struct { |
| 1628 | obj_di.* = try readMachODebugInfo(self.allocator, macho_file); | 1618 | obj_di.* = try readMachODebugInfo(self.allocator, macho_file); |
| 1629 | obj_di.base_address = base_address; | 1619 | obj_di.base_address = base_address; |
| 1630 | obj_di.vmaddr_slide = vmaddr_slide; | 1620 | obj_di.vmaddr_slide = vmaddr_slide; |
| | 1621 | obj_di.unwind_info = unwind_info; |
| | 1622 | obj_di.eh_frame = eh_frame; |
| 1631 | | 1623 | |
| 1632 | try self.address_map.putNoClobber(base_address, obj_di); | 1624 | try self.address_map.putNoClobber(base_address, obj_di); |
| 1633 | | 1625 | |
| ... | @@ -1932,9 +1924,10 @@ pub const ModuleDebugInfo = switch (native_os) { | ... | @@ -1932,9 +1924,10 @@ pub const ModuleDebugInfo = switch (native_os) { |
| 1932 | symbols: []const MachoSymbol, | 1924 | symbols: []const MachoSymbol, |
| 1933 | strings: [:0]const u8, | 1925 | strings: [:0]const u8, |
| 1934 | ofiles: OFileTable, | 1926 | ofiles: OFileTable, |
| 1935 | // Backed by mapped_memory | 1927 | |
| 1936 | unwind_info: ?[]const u8, | 1928 | // Backed by the in-memory sections mapped by the loader |
| 1937 | eh_frame: ?[]const u8, | 1929 | unwind_info: ?[]const u8 = null, |
| | 1930 | eh_frame: ?[]const u8 = null, |
| 1938 | | 1931 | |
| 1939 | const OFileTable = std.StringHashMap(OFileInfo); | 1932 | const OFileTable = std.StringHashMap(OFileInfo); |
| 1940 | const OFileInfo = struct { | 1933 | const OFileInfo = struct { |