authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 15:11:22+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-27 16:43:35+01:00
log0409dda46b3c301ea4aa3f88f4ed82b7aeeb681c
tree7438e78bed7234ae1d24bf174bf05ffea40c9591
parent246e3e0c75c5f0201f3be6514360adf04669caab

zld: align to 8 and pad out function starts and data in code sections


1 files changed, 23 insertions(+), 9 deletions(-)

src/link/MachO/zld.zig+23-9
...@@ -2412,16 +2412,23 @@ pub const Zld = struct {...@@ -2412,16 +2412,23 @@ pub const Zld = struct {
2412 }2412 }
24132413
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;
24182425
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 });
24202427
2421 try self.file.pwriteAll(buffer.items, offset);2428 try self.file.pwriteAll(buffer.items, offset);
24222429
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 }
24262433
2427 fn filterDataInCode(2434 fn filterDataInCode(
...@@ -2486,16 +2493,23 @@ pub const Zld = struct {...@@ -2486,16 +2493,23 @@ pub const Zld = struct {
2486 }2493 }
24872494
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));
24922506
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 });
24942508
2495 try self.file.pwriteAll(mem.sliceAsBytes(out_dice.items), offset);2509 try self.file.pwriteAll(buffer, offset);
24962510
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 }
25002514
2501 fn writeSymtabs(self: *Zld) !void {2515 fn writeSymtabs(self: *Zld) !void {