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 {
35783578 const nsyms = nlocals + nexports + nimports;
35793579
35803580 const seg = self.getLinkeditSegmentPtr();
3581 const offset = mem.alignForwardGeneric(
3582 u64,
3583 seg.fileoff + seg.filesize,
3584 @alignOf(macho.nlist_64),
3585 );
3581 const offset = seg.fileoff + seg.filesize;
3582 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
35863583 const needed_size = nsyms * @sizeOf(macho.nlist_64);
35873584 seg.filesize = offset + needed_size - seg.fileoff;
3585 assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)));
35883586
35893587 var buffer = std.ArrayList(u8).init(gpa);
35903588 defer buffer.deinit();
......@@ -3637,15 +3635,17 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {
36373635 const iundefsym = iextdefsym + ctx.nextdefsym;
36383636
36393637 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)));
36413640 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
36463646 var buf = std.ArrayList(u8).init(gpa);
36473647 defer buf.deinit();
3648 try buf.ensureTotalCapacity(needed_size);
3648 try buf.ensureTotalCapacity(needed_size_aligned);
36493649 const writer = buf.writer();
36503650
36513651 if (self.stubs_section_index) |sect_id| {
......@@ -3684,7 +3684,12 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {
36843684 }
36853685 }
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);
36883693 try self.base.file.?.pwriteAll(buf.items, offset);
36893694
36903695 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;
src/link/MachO/zld.zig+15-10
......@@ -2584,13 +2584,11 @@ pub const Zld = struct {
25842584 const nsyms = nlocals + nexports + nimports;
25852585
25862586 const seg = self.getLinkeditSegmentPtr();
2587 const offset = mem.alignForwardGeneric(
2588 u64,
2589 seg.fileoff + seg.filesize,
2590 @alignOf(macho.nlist_64),
2591 );
2587 const offset = seg.fileoff + seg.filesize;
2588 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
25922589 const needed_size = nsyms * @sizeOf(macho.nlist_64);
25932590 seg.filesize = offset + needed_size - seg.fileoff;
2591 assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)));
25942592
25952593 var buffer = std.ArrayList(u8).init(gpa);
25962594 defer buffer.deinit();
......@@ -2643,15 +2641,17 @@ pub const Zld = struct {
26432641 const iundefsym = iextdefsym + ctx.nextdefsym;
26442642
26452643 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)));
26472646 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
26522652 var buf = std.ArrayList(u8).init(gpa);
26532653 defer buf.deinit();
2654 try buf.ensureTotalCapacity(needed_size);
2654 try buf.ensureTotalCapacityPrecise(needed_size_aligned);
26552655 const writer = buf.writer();
26562656
26572657 if (self.getSectionByName("__TEXT", "__stubs")) |sect_id| {
......@@ -2687,7 +2687,12 @@ pub const Zld = struct {
26872687 }
26882688 }
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);
26912696 try self.file.pwriteAll(buf.items, offset);
26922697
26932698 self.dysymtab_cmd.nlocalsym = ctx.nlocalsym;