diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 3981fc0f7c..1ab71b6a5c 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -3606,17 +3606,25 @@ fn writeSymtab(self: *MachO) !SymtabCtx { } fn writeStrtab(self: *MachO) !void { + const gpa = self.base.allocator; const seg = self.getLinkeditSegmentPtr(); - const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)); + const offset = seg.fileoff + seg.filesize; + assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64))); const needed_size = self.strtab.buffer.items.len; - seg.filesize = offset + needed_size - seg.fileoff; + const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64)); + seg.filesize = offset + needed_size_aligned - seg.fileoff; - log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size }); + log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned }); - try self.base.file.?.pwriteAll(self.strtab.buffer.items, offset); + const buffer = try gpa.alloc(u8, needed_size_aligned); + defer gpa.free(buffer); + mem.set(u8, buffer, 0); + mem.copy(u8, buffer, self.strtab.buffer.items); + + try self.base.file.?.pwriteAll(buffer, offset); self.symtab_cmd.stroff = @intCast(u32, offset); - self.symtab_cmd.strsize = @intCast(u32, needed_size); + self.symtab_cmd.strsize = @intCast(u32, needed_size_aligned); } const SymtabCtx = struct { diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig index 400985c4d7..2cf1f34743 100644 --- a/src/link/MachO/zld.zig +++ b/src/link/MachO/zld.zig @@ -2613,16 +2613,23 @@ pub const Zld = struct { fn writeStrtab(self: *Zld) !void { const seg = self.getLinkeditSegmentPtr(); - const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)); + const offset = seg.fileoff + seg.filesize; + assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64))); const needed_size = self.strtab.buffer.items.len; - seg.filesize = offset + needed_size - seg.fileoff; + const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64)); + seg.filesize = offset + needed_size_aligned - seg.fileoff; - log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size }); + log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned }); - try self.file.pwriteAll(self.strtab.buffer.items, offset); + const buffer = try self.gpa.alloc(u8, needed_size_aligned); + defer self.gpa.free(buffer); + mem.set(u8, buffer, 0); + mem.copy(u8, buffer, self.strtab.buffer.items); + + try self.file.pwriteAll(buffer, offset); self.symtab_cmd.stroff = @intCast(u32, offset); - self.symtab_cmd.strsize = @intCast(u32, needed_size); + self.symtab_cmd.strsize = @intCast(u32, needed_size_aligned); } const SymtabCtx = struct {