authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 15:24:25+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 16:43:35+01:00
log2620146834e652cae7e1ee9112f791ddae21963b
tree40297eb075793a90df8a7bc7a41e3099dcf54deb
parentd83d39297c1b9b8ac84ed12f13f94c57ca52b8bb

macho+zld: align to 8 and pad out strtab


2 files changed, 25 insertions(+), 10 deletions(-)

src/link/MachO.zig+13-5
...@@ -3606,17 +3606,25 @@ fn writeSymtab(self: *MachO) !SymtabCtx {...@@ -3606,17 +3606,25 @@ fn writeSymtab(self: *MachO) !SymtabCtx {
3606}3606}
36073607
3608fn writeStrtab(self: *MachO) !void {3608fn writeStrtab(self: *MachO) !void {
3609 const gpa = self.base.allocator;
3609 const seg = self.getLinkeditSegmentPtr();3610 const seg = self.getLinkeditSegmentPtr();
3610 const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64));3611 const offset = seg.fileoff + seg.filesize;
3612 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
3611 const needed_size = self.strtab.buffer.items.len;3613 const needed_size = self.strtab.buffer.items.len;
3612 seg.filesize = offset + needed_size - seg.fileoff;3614 const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64));
3615 seg.filesize = offset + needed_size_aligned - seg.fileoff;
3616
3617 log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned });
36133618
3614 log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size });3619 const buffer = try gpa.alloc(u8, needed_size_aligned);
3620 defer gpa.free(buffer);
3621 mem.set(u8, buffer, 0);
3622 mem.copy(u8, buffer, self.strtab.buffer.items);
36153623
3616 try self.base.file.?.pwriteAll(self.strtab.buffer.items, offset);3624 try self.base.file.?.pwriteAll(buffer, offset);
36173625
3618 self.symtab_cmd.stroff = @intCast(u32, offset);3626 self.symtab_cmd.stroff = @intCast(u32, offset);
3619 self.symtab_cmd.strsize = @intCast(u32, needed_size);3627 self.symtab_cmd.strsize = @intCast(u32, needed_size_aligned);
3620}3628}
36213629
3622const SymtabCtx = struct {3630const SymtabCtx = struct {
src/link/MachO/zld.zig+12-5
...@@ -2613,16 +2613,23 @@ pub const Zld = struct {...@@ -2613,16 +2613,23 @@ pub const Zld = struct {
26132613
2614 fn writeStrtab(self: *Zld) !void {2614 fn writeStrtab(self: *Zld) !void {
2615 const seg = self.getLinkeditSegmentPtr();2615 const seg = self.getLinkeditSegmentPtr();
2616 const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64));2616 const offset = seg.fileoff + seg.filesize;
2617 assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64)));
2617 const needed_size = self.strtab.buffer.items.len;2618 const needed_size = self.strtab.buffer.items.len;
2618 seg.filesize = offset + needed_size - seg.fileoff;2619 const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64));
2620 seg.filesize = offset + needed_size_aligned - seg.fileoff;
26192621
2620 log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size });2622 log.debug("writing string table from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned });
26212623
2622 try self.file.pwriteAll(self.strtab.buffer.items, offset);2624 const buffer = try self.gpa.alloc(u8, needed_size_aligned);
2625 defer self.gpa.free(buffer);
2626 mem.set(u8, buffer, 0);
2627 mem.copy(u8, buffer, self.strtab.buffer.items);
2628
2629 try self.file.pwriteAll(buffer, offset);
26232630
2624 self.symtab_cmd.stroff = @intCast(u32, offset);2631 self.symtab_cmd.stroff = @intCast(u32, offset);
2625 self.symtab_cmd.strsize = @intCast(u32, needed_size);2632 self.symtab_cmd.strsize = @intCast(u32, needed_size_aligned);
2626 }2633 }
26272634
2628 const SymtabCtx = struct {2635 const SymtabCtx = struct {