authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-27 18:41:10-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-28 18:30:57-07:00
loge4181972470c29f83480fdd6d5a465e1f8d14d7b
tree3a2c1ae7cd82241b108129348a7e896c5f15486b
parent5be9df710cb916ca714f73fc8b25d9300c7768f5

link.MachO: code sig size grows when emitting it


2 files changed, 15 insertions(+), 9 deletions(-)

src/link/MachO.zig+14-8
......@@ -3015,24 +3015,30 @@ pub fn writeCodeSignature(self: *MachO, code_sig: *CodeSignature) !void {
30153015 const offset = self.codesig_cmd.dataoff;
30163016 const gpa = self.base.comp.gpa;
30173017
3018 const buffer = try gpa.alloc(u8, code_sig.size());
3019 defer gpa.free(buffer);
3020 var writer: Writer = .fixed(buffer);
3021 try code_sig.writeAdhocSignature(self, .{
3018 var buffer: std.Io.Writer.Allocating = .init(gpa);
3019 defer buffer.deinit();
3020 // The writeAdhocSignature function internally changes code_sig.size()
3021 // during the execution.
3022 try buffer.ensureUnusedCapacity(code_sig.size());
3023
3024 code_sig.writeAdhocSignature(self, .{
30223025 .file = self.base.file.?,
30233026 .exec_seg_base = seg.fileoff,
30243027 .exec_seg_limit = seg.filesize,
30253028 .file_size = offset,
30263029 .dylib = self.base.isDynLib(),
3027 }, &writer);
3028 assert(writer.buffered().len == code_sig.size());
3030 }, &buffer.writer) catch |err| switch (err) {
3031 error.WriteFailed => return error.OutOfMemory,
3032 else => |e| return e,
3033 };
3034 assert(buffer.written().len == code_sig.size());
30293035
30303036 log.debug("writing code signature from 0x{x} to 0x{x}", .{
30313037 offset,
3032 offset + writer.buffered().len,
3038 offset + buffer.written().len,
30333039 });
30343040
3035 try self.pwriteAll(writer.buffered(), offset);
3041 try self.pwriteAll(buffer.written(), offset);
30363042}
30373043
30383044pub fn updateFunc(
src/link/MachO/CodeSignature.zig+1-1
......@@ -263,7 +263,7 @@ pub fn writeAdhocSignature(
263263 self: *CodeSignature,
264264 macho_file: *MachO,
265265 opts: WriteOpts,
266 writer: anytype,
266 writer: *std.Io.Writer,
267267) !void {
268268 const tracy = trace(@src());
269269 defer tracy.end();