| ... | @@ -2412,16 +2412,23 @@ pub const Zld = struct { | ... | @@ -2412,16 +2412,23 @@ pub const Zld = struct { |
| 2412 | } | 2412 | } |
| 2413 | | 2413 | |
| 2414 | const link_seg = self.getLinkeditSegmentPtr(); | 2414 | const link_seg = self.getLinkeditSegmentPtr(); |
| 2415 | const offset = mem.alignForwardGeneric(u64, link_seg.fileoff + link_seg.filesize, @alignOf(u64)); | 2415 | const offset = link_seg.fileoff + link_seg.filesize; |
| | 2416 | assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64))); |
| 2416 | const needed_size = buffer.items.len; | 2417 | const needed_size = buffer.items.len; |
| 2417 | link_seg.filesize = offset + needed_size - link_seg.fileoff; | 2418 | const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64)); |
| | 2419 | const padding = needed_size_aligned - needed_size; |
| | 2420 | if (padding > 0) { |
| | 2421 | try buffer.ensureUnusedCapacity(padding); |
| | 2422 | buffer.appendNTimesAssumeCapacity(0, padding); |
| | 2423 | } |
| | 2424 | link_seg.filesize = offset + needed_size_aligned - link_seg.fileoff; |
| 2418 | | 2425 | |
| 2419 | log.debug("writing function starts info from 0x{x} to 0x{x}", .{ offset, offset + needed_size }); | 2426 | log.debug("writing function starts info from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned }); |
| 2420 | | 2427 | |
| 2421 | try self.file.pwriteAll(buffer.items, offset); | 2428 | try self.file.pwriteAll(buffer.items, offset); |
| 2422 | | 2429 | |
| 2423 | self.function_starts_cmd.dataoff = @intCast(u32, offset); | 2430 | self.function_starts_cmd.dataoff = @intCast(u32, offset); |
| 2424 | self.function_starts_cmd.datasize = @intCast(u32, needed_size); | 2431 | self.function_starts_cmd.datasize = @intCast(u32, needed_size_aligned); |
| 2425 | } | 2432 | } |
| 2426 | | 2433 | |
| 2427 | fn filterDataInCode( | 2434 | fn filterDataInCode( |
| ... | @@ -2486,16 +2493,23 @@ pub const Zld = struct { | ... | @@ -2486,16 +2493,23 @@ pub const Zld = struct { |
| 2486 | } | 2493 | } |
| 2487 | | 2494 | |
| 2488 | const seg = self.getLinkeditSegmentPtr(); | 2495 | const seg = self.getLinkeditSegmentPtr(); |
| 2489 | const offset = mem.alignForwardGeneric(u64, seg.fileoff + seg.filesize, @alignOf(u64)); | 2496 | const offset = seg.fileoff + seg.filesize; |
| | 2497 | assert(mem.isAlignedGeneric(u64, offset, @alignOf(u64))); |
| 2490 | const needed_size = out_dice.items.len * @sizeOf(macho.data_in_code_entry); | 2498 | const needed_size = out_dice.items.len * @sizeOf(macho.data_in_code_entry); |
| 2491 | seg.filesize = offset + needed_size - seg.fileoff; | 2499 | const needed_size_aligned = mem.alignForwardGeneric(u64, needed_size, @alignOf(u64)); |
| | 2500 | seg.filesize = offset + needed_size_aligned - seg.fileoff; |
| | 2501 | |
| | 2502 | const buffer = try self.gpa.alloc(u8, needed_size_aligned); |
| | 2503 | defer self.gpa.free(buffer); |
| | 2504 | mem.set(u8, buffer, 0); |
| | 2505 | mem.copy(u8, buffer, mem.sliceAsBytes(out_dice.items)); |
| 2492 | | 2506 | |
| 2493 | log.debug("writing data-in-code from 0x{x} to 0x{x}", .{ offset, offset + needed_size }); | 2507 | log.debug("writing data-in-code from 0x{x} to 0x{x}", .{ offset, offset + needed_size_aligned }); |
| 2494 | | 2508 | |
| 2495 | try self.file.pwriteAll(mem.sliceAsBytes(out_dice.items), offset); | 2509 | try self.file.pwriteAll(buffer, offset); |
| 2496 | | 2510 | |
| 2497 | self.data_in_code_cmd.dataoff = @intCast(u32, offset); | 2511 | self.data_in_code_cmd.dataoff = @intCast(u32, offset); |
| 2498 | self.data_in_code_cmd.datasize = @intCast(u32, needed_size); | 2512 | self.data_in_code_cmd.datasize = @intCast(u32, needed_size_aligned); |
| 2499 | } | 2513 | } |
| 2500 | | 2514 | |
| 2501 | fn writeSymtabs(self: *Zld) !void { | 2515 | fn writeSymtabs(self: *Zld) !void { |