authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 15:19:14+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 16:43:35+01:00
logd83d39297c1b9b8ac84ed12f13f94c57ca52b8bb
treecd4e8ba0f627240ee1c535642f293008f86db8c0
parent0409dda46b3c301ea4aa3f88f4ed82b7aeeb681c

macho+zld: align to 8 and pad out dysymtab


2 files changed, 30 insertions(+), 20 deletions(-)

src/link/MachO.zig+15-10
...@@ -3578,13 +3578,11 @@ fn writeSymtab(self: *MachO) !SymtabCtx {...@@ -3578,13 +3578,11 @@ fn writeSymtab(self: *MachO) !SymtabCtx {
3578 const nsyms = nlocals + nexports + nimports;3578 const nsyms = nlocals + nexports + nimports;
35793579
3580 const seg = self.getLinkeditSegmentPtr();3580 const seg = self.getLinkeditSegmentPtr();
3581 const offset = mem.alignForwardGeneric(3581 const offset = seg.fileoff + seg.filesize;
3582 u64,3582 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
3583 seg.fileoff + seg.filesize,
3584 @alignOf(macho.nlist_64),
3585 );
3586 const needed_size = nsyms * @sizeOf(macho.nlist_64);3583 const needed_size = nsyms * @sizeOf(macho.nlist_64);
3587 seg.filesize = offset + needed_size - seg.fileoff;3584 seg.filesize = offset + needed_size - seg.fileoff;
3585 assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)));
35883586
3589 var buffer = std.ArrayList(u8).init(gpa);3587 var buffer = std.ArrayList(u8).init(gpa);
3590 defer buffer.deinit();3588 defer buffer.deinit();
...@@ -3637,15 +3635,17 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {...@@ -3637,15 +3635,17 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {
3637 const iundefsym = iextdefsym + ctx.nextdefsym;3635 const iundefsym = iextdefsym + ctx.nextdefsym;
36383636
3639 const seg = self.getLinkeditSegmentPtr();3637 const seg = self.getLinkeditSegmentPtr();
3640 const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64));3638 const offset = seg.fileoff + seg.filesize;
3639 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
3641 const needed_size = nindirectsyms * @sizeOf(u32);3640 const needed_size = nindirectsyms * @sizeOf(u32);
3642 seg.filesize = offset + needed_size - seg.fileoff;3641 const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64));
3642 seg.filesize = offset + needed_size_aligned - seg.fileoff;
36433643
3644 log.debug("writing indirect symbol table from 0x{x} to 0x{x}", .{ offset, offset + needed_size });3644 log.debug("writing indirect symbol table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned });
36453645
3646 var buf = std.ArrayList(u8).init(gpa);3646 var buf = std.ArrayList(u8).init(gpa);
3647 defer buf.deinit();3647 defer buf.deinit();
3648 try buf.ensureTotalCapacity(needed_size);3648 try buf.ensureTotalCapacity(needed_size_aligned);
3649 const writer = buf.writer();3649 const writer = buf.writer();
36503650
3651 if (self.stubs_section_index) |sect_id| {3651 if (self.stubs_section_index) |sect_id| {
...@@ -3684,7 +3684,12 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {...@@ -3684,7 +3684,12 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {
3684 }3684 }
3685 }3685 }
36863686
3687 assert(buf.items.len == needed_size);3687 const padding = needed_size_aligned - needed_size;
3688 if (padding > 0) {
3689 buf.appendNTimesAssumeCapacity(0, padding);
3690 }
3691
3692 assert(buf.items.len == needed_size_aligned);
3688 try self.base.file.?.pwriteAll(buf.items, offset);3693 try self.base.file.?.pwriteAll(buf.items, offset);
36893694
3690 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;3695 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;
src/link/MachO/zld.zig+15-10
...@@ -2584,13 +2584,11 @@ pub const Zld = struct {...@@ -2584,13 +2584,11 @@ pub const Zld = struct {
2584 const nsyms = nlocals + nexports + nimports;2584 const nsyms = nlocals + nexports + nimports;
25852585
2586 const seg = self.getLinkeditSegmentPtr();2586 const seg = self.getLinkeditSegmentPtr();
2587 const offset = mem.alignForwardGeneric(2587 const offset = seg.fileoff + seg.filesize;
2588 u64,2588 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
2589 seg.fileoff + seg.filesize,
2590 @alignOf(macho.nlist_64),
2591 );
2592 const needed_size = nsyms * @sizeOf(macho.nlist_64);2589 const needed_size = nsyms * @sizeOf(macho.nlist_64);
2593 seg.filesize = offset + needed_size - seg.fileoff;2590 seg.filesize = offset + needed_size - seg.fileoff;
2591 assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)));
25942592
2595 var buffer = std.ArrayList(u8).init(gpa);2593 var buffer = std.ArrayList(u8).init(gpa);
2596 defer buffer.deinit();2594 defer buffer.deinit();
...@@ -2643,15 +2641,17 @@ pub const Zld = struct {...@@ -2643,15 +2641,17 @@ pub const Zld = struct {
2643 const iundefsym = iextdefsym + ctx.nextdefsym;2641 const iundefsym = iextdefsym + ctx.nextdefsym;
26442642
2645 const seg = self.getLinkeditSegmentPtr();2643 const seg = self.getLinkeditSegmentPtr();
2646 const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64));2644 const offset = seg.fileoff + seg.filesize;
2645 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
2647 const needed_size = nindirectsyms * @sizeOf(u32);2646 const needed_size = nindirectsyms * @sizeOf(u32);
2648 seg.filesize = offset + needed_size - seg.fileoff;2647 const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64));
2648 seg.filesize = offset + needed_size_aligned - seg.fileoff;
26492649
2650 log.debug("writing indirect symbol table from 0x{x} to 0x{x}", .{ offset, offset + needed_size });2650 log.debug("writing indirect symbol table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned });
26512651
2652 var buf = std.ArrayList(u8).init(gpa);2652 var buf = std.ArrayList(u8).init(gpa);
2653 defer buf.deinit();2653 defer buf.deinit();
2654 try buf.ensureTotalCapacity(needed_size);2654 try buf.ensureTotalCapacityPrecise(needed_size_aligned);
2655 const writer = buf.writer();2655 const writer = buf.writer();
26562656
2657 if (self.getSectionByName("__TEXT", "__stubs")) |sect_id| {2657 if (self.getSectionByName("__TEXT", "__stubs")) |sect_id| {
...@@ -2687,7 +2687,12 @@ pub const Zld = struct {...@@ -2687,7 +2687,12 @@ pub const Zld = struct {
2687 }2687 }
2688 }2688 }
26892689
2690 assert(buf.items.len == needed_size);2690 const padding = needed_size_aligned - needed_size;
2691 if (padding > 0) {
2692 buf.appendNTimesAssumeCapacity(0, padding);
2693 }
2694
2695 assert(buf.items.len == needed_size_aligned);
2691 try self.file.pwriteAll(buf.items, offset);2696 try self.file.pwriteAll(buf.items, offset);
26922697
2693 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;2698 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;