From 3bdbf81a3f574c0cf538b443825558e45bceecee Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Wed, 17 Jul 2024 00:14:52 +0200 Subject: macho: fix emitting data-in-code entries --- src/link/MachO.zig | 6 +++++- src/link/MachO/synthetic.zig | 33 ++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/link/MachO.zig b/src/link/MachO.zig index df11df30a1..08cbc9cb67 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -2521,8 +2521,12 @@ fn writeDyldInfo(self: *MachO) !void { pub fn writeDataInCode(self: *MachO) !void { const tracy = trace(@src()); defer tracy.end(); + const gpa = self.base.comp.gpa; const cmd = self.data_in_code_cmd; - try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.data_in_code.entries.items), cmd.dataoff); + var buffer = try std.ArrayList(u8).initCapacity(gpa, self.data_in_code.size()); + defer buffer.deinit(); + try self.data_in_code.write(self, buffer.writer()); + try self.base.file.?.pwriteAll(buffer.items, cmd.dataoff); } fn writeIndsymtab(self: *MachO) !void { diff --git a/src/link/MachO/synthetic.zig b/src/link/MachO/synthetic.zig index 8b5a87c26e..d7316d63b7 100644 --- a/src/link/MachO/synthetic.zig +++ b/src/link/MachO/synthetic.zig @@ -656,7 +656,7 @@ pub const Indsymtab = struct { }; pub const DataInCode = struct { - entries: std.ArrayListUnmanaged(macho.data_in_code_entry) = .{}, + entries: std.ArrayListUnmanaged(Entry) = .{}, pub fn deinit(dice: *DataInCode, allocator: Allocator) void { dice.entries.deinit(allocator); @@ -668,10 +668,6 @@ pub const DataInCode = struct { pub fn updateSize(dice: *DataInCode, macho_file: *MachO) !void { const gpa = macho_file.base.comp.gpa; - const base_address = if (!macho_file.base.isRelocatable()) - macho_file.getTextSegment().vmaddr - else - 0; for (macho_file.objects.items) |index| { const object = macho_file.getFile(index).?.object; @@ -683,7 +679,6 @@ pub const DataInCode = struct { for (object.getAtoms()) |atom_index| { if (next_dice >= dices.len) break; const atom = object.getAtom(atom_index) orelse continue; - if (!atom.flags.alive) continue; const start_off = atom.getInputAddress(macho_file); const end_off = start_off + atom.size; const start_dice = next_dice; @@ -696,7 +691,8 @@ pub const DataInCode = struct { if (atom.flags.alive) for (dices[start_dice..next_dice]) |d| { dice.entries.appendAssumeCapacity(.{ - .offset = @intCast(atom.getAddress(macho_file) + d.offset - start_off - base_address), + .atom_ref = .{ .index = atom_index, .file = index }, + .offset = @intCast(d.offset - start_off), .length = d.length, .kind = d.kind, }); @@ -706,6 +702,29 @@ pub const DataInCode = struct { macho_file.data_in_code_cmd.datasize = math.cast(u32, dice.size()) orelse return error.Overflow; } + + pub fn write(dice: DataInCode, macho_file: *MachO, writer: anytype) !void { + const base_address = if (!macho_file.base.isRelocatable()) + macho_file.getTextSegment().vmaddr + else + 0; + for (dice.entries.items) |entry| { + const atom_address = entry.atom_ref.getAtom(macho_file).?.getAddress(macho_file); + const offset = atom_address + entry.offset - base_address; + try writer.writeStruct(macho.data_in_code_entry{ + .offset = @intCast(offset), + .length = entry.length, + .kind = entry.kind, + }); + } + } + + const Entry = struct { + atom_ref: MachO.Ref, + offset: u32, + length: u16, + kind: u16, + }; }; const aarch64 = @import("../aarch64.zig"); -- cgit v1.2.3