From 57d7ad9172497dd1e341f5c37228544f38e3959d Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 14 Jan 2022 22:32:33 +0100 Subject: [PATCH] macho: code signature needs to be 16 bytes aligned --- src/link/MachO.zig | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 7dc6c52372dce4ea3633e21b75e58b24db2d2321..27a1f8d513a9e68d688aed16b42c5c6620f7e40c 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -5774,7 +5774,10 @@ fn writeCodeSignaturePadding(self: *MachO) !void { const linkedit_segment = &self.load_commands.items[self.linkedit_segment_cmd_index.?].segment; const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].linkedit_data; - const fileoff = linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize; + // Code signature data has to be 16-bytes aligned for Apple tools to recognize the file + // https://github.com/opensource-apple/cctools/blob/fdb4825f303fd5c0751be524babd32958181b3ed/libstuff/checkout.c#L271 + const fileoff = mem.alignForwardGeneric(u64, linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize, 16); + const padding = fileoff - (linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize); const needed_size = CodeSignature.calcCodeSignaturePaddingSize( self.base.options.emit.?.sub_path, fileoff, @@ -5784,7 +5787,7 @@ fn writeCodeSignaturePadding(self: *MachO) !void { code_sig_cmd.datasize = needed_size; // Advance size of __LINKEDIT segment - linkedit_segment.inner.filesize += needed_size; + linkedit_segment.inner.filesize += needed_size + padding; if (linkedit_segment.inner.vmsize < linkedit_segment.inner.filesize) { linkedit_segment.inner.vmsize = mem.alignForwardGeneric(u64, linkedit_segment.inner.filesize, self.page_size); } -- 2.54.0