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 {...@@ -3015,24 +3015,30 @@ pub fn writeCodeSignature(self: *MachO, code_sig: *CodeSignature) !void {
3015 const offset = self.codesig_cmd.dataoff;3015 const offset = self.codesig_cmd.dataoff;
3016 const gpa = self.base.comp.gpa;3016 const gpa = self.base.comp.gpa;
30173017
3018 const buffer = try gpa.alloc(u8, code_sig.size());3018 var buffer: std.Io.Writer.Allocating = .init(gpa);
3019 defer gpa.free(buffer);3019 defer buffer.deinit();
3020 var writer: Writer = .fixed(buffer);3020 // The writeAdhocSignature function internally changes code_sig.size()
3021 try code_sig.writeAdhocSignature(self, .{3021 // during the execution.
3022 try buffer.ensureUnusedCapacity(code_sig.size());
3023
3024 code_sig.writeAdhocSignature(self, .{
3022 .file = self.base.file.?,3025 .file = self.base.file.?,
3023 .exec_seg_base = seg.fileoff,3026 .exec_seg_base = seg.fileoff,
3024 .exec_seg_limit = seg.filesize,3027 .exec_seg_limit = seg.filesize,
3025 .file_size = offset,3028 .file_size = offset,
3026 .dylib = self.base.isDynLib(),3029 .dylib = self.base.isDynLib(),
3027 }, &writer);3030 }, &buffer.writer) catch |err| switch (err) {
3028 assert(writer.buffered().len == code_sig.size());3031 error.WriteFailed => return error.OutOfMemory,
3032 else => |e| return e,
3033 };
3034 assert(buffer.written().len == code_sig.size());
30293035
3030 log.debug("writing code signature from 0x{x} to 0x{x}", .{3036 log.debug("writing code signature from 0x{x} to 0x{x}", .{
3031 offset,3037 offset,
3032 offset + writer.buffered().len,3038 offset + buffer.written().len,
3033 });3039 });
30343040
3035 try self.pwriteAll(writer.buffered(), offset);3041 try self.pwriteAll(buffer.written(), offset);
3036}3042}
30373043
3038pub fn updateFunc(3044pub fn updateFunc(
src/link/MachO/CodeSignature.zig+1-1
...@@ -263,7 +263,7 @@ pub fn writeAdhocSignature(...@@ -263,7 +263,7 @@ pub fn writeAdhocSignature(
263 self: *CodeSignature,263 self: *CodeSignature,
264 macho_file: *MachO,264 macho_file: *MachO,
265 opts: WriteOpts,265 opts: WriteOpts,
266 writer: anytype,266 writer: *std.Io.Writer,
267) !void {267) !void {
268 const tracy = trace(@src());268 const tracy = trace(@src());
269 defer tracy.end();269 defer tracy.end();