| author | |
| committer | |
| log | d83d39297c1b9b8ac84ed12f13f94c57ca52b8bb |
| tree | cd4e8ba0f627240ee1c535642f293008f86db8c0 |
| parent | 0409dda46b3c301ea4aa3f88f4ed82b7aeeb681c |
2 files changed, 30 insertions(+), 20 deletions(-)
src/link/MachO.zig+15-10| ... | ... | @@ -3578,13 +3578,11 @@ fn writeSymtab(self: *MachO) !SymtabCtx { |
| 3578 | 3578 | const nsyms = nlocals + nexports + nimports; |
| 3579 | 3579 | |
| 3580 | 3580 | 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))); | |
| 3586 | 3583 | const needed_size = nsyms * @sizeOf(macho.nlist_64); |
| 3587 | 3584 | seg.filesize = offset + needed_size - seg.fileoff; |
| 3585 | assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64))); | |
| 3588 | 3586 | |
| 3589 | 3587 | var buffer = std.ArrayList(u8).init(gpa); |
| 3590 | 3588 | defer buffer.deinit(); |
| ... | ... | @@ -3637,15 +3635,17 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void { |
| 3637 | 3635 | const iundefsym = iextdefsym + ctx.nextdefsym; |
| 3638 | 3636 | |
| 3639 | 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 | 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; | |
| 3643 | 3643 | |
| 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 }); | |
| 3645 | 3645 | |
| 3646 | 3646 | var buf = std.ArrayList(u8).init(gpa); |
| 3647 | 3647 | defer buf.deinit(); |
| 3648 | try buf.ensureTotalCapacity(needed_size); | |
| 3648 | try buf.ensureTotalCapacity(needed_size_aligned); | |
| 3649 | 3649 | const writer = buf.writer(); |
| 3650 | 3650 | |
| 3651 | 3651 | if (self.stubs_section_index) |sect_id| { |
| ... | ... | @@ -3684,7 +3684,12 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void { |
| 3684 | 3684 | } |
| 3685 | 3685 | } |
| 3686 | 3686 | |
| 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 | 3693 | try self.base.file.?.pwriteAll(buf.items, offset); |
| 3689 | 3694 | |
| 3690 | 3695 | self.dysymtab_cmd.nlocalsym = ctx.nlocalsym; |
src/link/MachO/zld.zig+15-10| ... | ... | @@ -2584,13 +2584,11 @@ pub const Zld = struct { |
| 2584 | 2584 | const nsyms = nlocals + nexports + nimports; |
| 2585 | 2585 | |
| 2586 | 2586 | 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))); | |
| 2592 | 2589 | const needed_size = nsyms * @sizeOf(macho.nlist_64); |
| 2593 | 2590 | seg.filesize = offset + needed_size - seg.fileoff; |
| 2591 | assert(mem.isAlignedGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64))); | |
| 2594 | 2592 | |
| 2595 | 2593 | var buffer = std.ArrayList(u8).init(gpa); |
| 2596 | 2594 | defer buffer.deinit(); |
| ... | ... | @@ -2643,15 +2641,17 @@ pub const Zld = struct { |
| 2643 | 2641 | const iundefsym = iextdefsym + ctx.nextdefsym; |
| 2644 | 2642 | |
| 2645 | 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 | 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; | |
| 2649 | 2649 | |
| 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 }); | |
| 2651 | 2651 | |
| 2652 | 2652 | var buf = std.ArrayList(u8).init(gpa); |
| 2653 | 2653 | defer buf.deinit(); |
| 2654 | try buf.ensureTotalCapacity(needed_size); | |
| 2654 | try buf.ensureTotalCapacityPrecise(needed_size_aligned); | |
| 2655 | 2655 | const writer = buf.writer(); |
| 2656 | 2656 | |
| 2657 | 2657 | if (self.getSectionByName("__TEXT", "__stubs")) |sect_id| { |
| ... | ... | @@ -2687,7 +2687,12 @@ pub const Zld = struct { |
| 2687 | 2687 | } |
| 2688 | 2688 | } |
| 2689 | 2689 | |
| 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 | 2696 | try self.file.pwriteAll(buf.items, offset); |
| 2692 | 2697 | |
| 2693 | 2698 | self.dysymtab_cmd.nlocalsym = ctx.nlocalsym; |