| author | |
| committer | |
| log | 2620146834e652cae7e1ee9112f791ddae21963b |
| tree | 40297eb075793a90df8a7bc7a41e3099dcf54deb |
| parent | d83d39297c1b9b8ac84ed12f13f94c57ca52b8bb |
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 | } |
| 3607 | 3607 | ||
| 3608 | fn writeStrtab(self: *MachO) !void { | 3608 | fn 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 }); | ||
| 3613 | 3618 | ||
| 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); | ||
| 3615 | 3623 | ||
| 3616 | try self.base.file.?.pwriteAll(self.strtab.buffer.items, offset); | 3624 | try self.base.file.?.pwriteAll(buffer, offset); |
| 3617 | 3625 | ||
| 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 | } |
| 3621 | 3629 | ||
| 3622 | const SymtabCtx = struct { | 3630 | const 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 { |
| 2613 | 2613 | ||
| 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; | ||
| 2619 | 2621 | ||
| 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 }); |
| 2621 | 2623 | ||
| 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); | ||
| 2623 | 2630 | ||
| 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 | } |
| 2627 | 2634 | ||
| 2628 | const SymtabCtx = struct { | 2635 | const SymtabCtx = struct { |