| 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 | 3606 | } |
| 3607 | 3607 | |
| 3608 | 3608 | fn writeStrtab(self: *MachO) !void { |
| 3609 | const gpa = self.base.allocator; | |
| 3609 | 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 | 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 | 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 | 3630 | const SymtabCtx = struct { |
src/link/MachO/zld.zig+12-5| ... | ... | @@ -2613,16 +2613,23 @@ pub const Zld = struct { |
| 2613 | 2613 | |
| 2614 | 2614 | fn writeStrtab(self: *Zld) !void { |
| 2615 | 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 | 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 | 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 | 2635 | const SymtabCtx = struct { |