| ... | ... | @@ -1259,24 +1259,7 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn |
| 1259 | 1259 | .ncmds = hdr.ncmds, |
| 1260 | 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 | 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 | 1263 | .SYMTAB => break cmd.cast(macho.symtab_command).?, |
| 1281 | 1264 | else => {}, |
| 1282 | 1265 | } else return error.MissingDebugInfo; |
| ... | ... | @@ -1386,8 +1369,6 @@ fn readMachODebugInfo(allocator: mem.Allocator, macho_file: File) !ModuleDebugIn |
| 1386 | 1369 | .ofiles = ModuleDebugInfo.OFileTable.init(allocator), |
| 1387 | 1370 | .symbols = symbols, |
| 1388 | 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 | 1583 | )[0..header.sizeofcmds]), |
| 1603 | 1584 | }; |
| 1604 | 1585 | |
| 1586 | var unwind_info: ?[]const u8 = null; |
| 1587 | var eh_frame: ?[]const u8 = null; |
| 1605 | 1588 | while (it.next()) |cmd| switch (cmd.cmd()) { |
| 1606 | 1589 | .SEGMENT_64 => { |
| 1607 | 1590 | const segment_cmd = cmd.cast(macho.segment_command_64).?; |
| 1608 | 1591 | if (!mem.eql(u8, "__TEXT", segment_cmd.segName())) continue; |
| 1609 | 1592 | |
| 1610 | | const original_address = address - vmaddr_slide; |
| 1611 | | const seg_start = segment_cmd.vmaddr; |
| 1593 | const seg_start = segment_cmd.vmaddr + vmaddr_slide; |
| 1612 | 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 | 1596 | if (self.address_map.get(base_address)) |obj_di| { |
| 1615 | 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 | 1608 | const obj_di = try self.allocator.create(ModuleDebugInfo); |
| 1619 | 1609 | errdefer self.allocator.destroy(obj_di); |
| 1620 | 1610 | |
| ... | ... | @@ -1628,6 +1618,8 @@ pub const DebugInfo = struct { |
| 1628 | 1618 | obj_di.* = try readMachODebugInfo(self.allocator, macho_file); |
| 1629 | 1619 | obj_di.base_address = base_address; |
| 1630 | 1620 | obj_di.vmaddr_slide = vmaddr_slide; |
| 1621 | obj_di.unwind_info = unwind_info; |
| 1622 | obj_di.eh_frame = eh_frame; |
| 1631 | 1623 | |
| 1632 | 1624 | try self.address_map.putNoClobber(base_address, obj_di); |
| 1633 | 1625 | |
| ... | ... | @@ -1932,9 +1924,10 @@ pub const ModuleDebugInfo = switch (native_os) { |
| 1932 | 1924 | symbols: []const MachoSymbol, |
| 1933 | 1925 | strings: [:0]const u8, |
| 1934 | 1926 | ofiles: OFileTable, |
| 1935 | | // Backed by mapped_memory |
| 1936 | | unwind_info: ?[]const u8, |
| 1937 | | eh_frame: ?[]const u8, |
| 1927 | |
| 1928 | // Backed by the in-memory sections mapped by the loader |
| 1929 | unwind_info: ?[]const u8 = null, |
| 1930 | eh_frame: ?[]const u8 = null, |
| 1938 | 1931 | |
| 1939 | 1932 | const OFileTable = std.StringHashMap(OFileInfo); |
| 1940 | 1933 | const OFileInfo = struct { |