commit 2620146834e652cae7e1ee9112f791ddae21963b (tree)
parent d83d39297c1b9b8ac84ed12f13f94c57ca52b8bb
Author: Jakub Konka <kubkon@jakubkonka.com>
Date: Tue, 27 Dec 2022 15:24:25 +0100
macho+zld: align to 8 and pad out strtab
Diffstat:
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git 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_aligned });
- log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size });
+ 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(self.strtab.buffer.items, offset);
+ 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
@@ -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 {