authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-09 00:00:35+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-04-13 10:56:03+02:00
log6e3f82ef28aa17c9fb7933af07b9823c1331f884
tree43b25688ca21c80516b675b7eb836f7d2accffd0
parent65c27d51f691524f63e964ad04cb12e3a77c5a9b

zld: fix parsing debug info


3 files changed, 32 insertions(+), 6 deletions(-)

src/link/MachO/Archive.zig+7-1
......@@ -211,10 +211,16 @@ pub fn parseObject(self: Archive, offset: u32) !Object {
211211
212212 log.warn("extracting object '{s}' from archive '{s}'", .{ object_name, self.name.? });
213213
214 const name = name: {
215 var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined;
216 const path = try std.os.realpath(self.name.?, &buffer);
217 break :name try std.fmt.allocPrint(self.allocator, "{s}({s})", .{ path, object_name });
218 };
219
214220 var object = Object.init(self.allocator);
215221 object.arch = self.arch.?;
216222 object.file = try fs.cwd().openFile(self.name.?, .{});
217 object.name = try std.fmt.allocPrint(self.allocator, "{s}({s})", .{ self.name.?, object_name });
223 object.name = name;
218224 object.file_offset = @intCast(u32, try reader.context.getPos());
219225 try object.parse();
220226
src/link/MachO/Object.zig+4
......@@ -71,6 +71,7 @@ const Stab = struct {
7171 tag: Tag,
7272 symbol: u32,
7373 size: ?u64 = null,
74 source_sect_id: u16,
7475
7576 const Tag = enum {
7677 function,
......@@ -387,6 +388,8 @@ pub fn parseDebugInfo(self: *Object) !void {
387388 };
388389
389390 for (self.symtab.items) |sym, index| {
391 if (sym.tag == .Undef) continue;
392
390393 const sym_name = self.getString(sym.inner.n_strx);
391394 const size = blk: for (debug_info.inner.func_list.items) |func| {
392395 if (func.pc_range) |range| {
......@@ -402,6 +405,7 @@ pub fn parseDebugInfo(self: *Object) !void {
402405 .tag = tag,
403406 .size = size,
404407 .symbol = @intCast(u32, index),
408 .source_sect_id = sym.inner.n_sect - 1,
405409 });
406410 }
407411}
src/link/MachO/Zld.zig+21-5
......@@ -236,6 +236,11 @@ fn parseInputFiles(self: *Zld, files: []const []const u8) !void {
236236 // First, classify input files as either object or archive.
237237 for (files) |file_name| {
238238 const file = try fs.cwd().openFile(file_name, .{});
239 const full_path = full_path: {
240 var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined;
241 const path = try std.fs.realpath(file_name, &buffer);
242 break :full_path try self.allocator.dupe(u8, path);
243 };
239244
240245 try_object: {
241246 const header = try file.reader().readStruct(macho.mach_header_64);
......@@ -248,7 +253,7 @@ fn parseInputFiles(self: *Zld, files: []const []const u8) !void {
248253 try classified.append(.{
249254 .kind = .object,
250255 .file = file,
251 .name = file_name,
256 .name = full_path,
252257 });
253258 continue;
254259 }
......@@ -264,7 +269,7 @@ fn parseInputFiles(self: *Zld, files: []const []const u8) !void {
264269 try classified.append(.{
265270 .kind = .archive,
266271 .file = file,
267 .name = file_name,
272 .name = full_path,
268273 });
269274 continue;
270275 }
......@@ -2441,7 +2446,7 @@ fn writeDebugInfo(self: *Zld) !void {
24412446 var stabs = std.ArrayList(macho.nlist_64).init(self.allocator);
24422447 defer stabs.deinit();
24432448
2444 for (self.objects.items) |object| {
2449 for (self.objects.items) |object, object_id| {
24452450 const tu_path = object.tu_path orelse continue;
24462451 const tu_mtime = object.tu_mtime orelse continue;
24472452 const dirname = std.fs.path.dirname(tu_path) orelse "./";
......@@ -2472,6 +2477,15 @@ fn writeDebugInfo(self: *Zld) !void {
24722477
24732478 for (object.stabs.items) |stab| {
24742479 const sym = object.symtab.items[stab.symbol];
2480
2481 // TODO We should clean this up.
2482 if (self.unhandled_sections.contains(.{
2483 .object_id = @intCast(u16, object_id),
2484 .source_sect_id = stab.source_sect_id,
2485 })) {
2486 continue;
2487 }
2488
24752489 switch (stab.tag) {
24762490 .function => {
24772491 try stabs.append(.{
......@@ -2549,8 +2563,8 @@ fn populateStringTable(self: *Zld) !void {
25492563 for (self.objects.items) |*object| {
25502564 for (object.symtab.items) |*sym| {
25512565 switch (sym.tag) {
2552 .Stab, .Local => {},
2553 else => continue,
2566 .Undef, .Import => continue,
2567 else => {},
25542568 }
25552569 const sym_name = object.getString(sym.inner.n_strx);
25562570 const n_strx = try self.makeString(sym_name);
......@@ -2559,6 +2573,8 @@ fn populateStringTable(self: *Zld) !void {
25592573 }
25602574
25612575 for (self.symtab.items()) |*entry| {
2576 if (entry.value.tag != .Import) continue;
2577
25622578 const n_strx = try self.makeString(entry.key);
25632579 entry.value.inner.n_strx = n_strx;
25642580 }