authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-14 22:32:33+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-14 22:32:33+01:00
logb3471ef3009c4e3164145692b1b5d0662077d949
treefb1cca18af4d59804a03c0330057f75082957992
parent1e481dfef5a2241bfc5460214dbd0daffe5063bc

macho: code signature needs to be 16 bytes aligned


1 files changed, 5 insertions(+), 2 deletions(-)

src/link/MachO.zig+5-2
...@@ -6044,7 +6044,10 @@ fn writeCodeSignaturePadding(self: *MachO) !void {...@@ -6044,7 +6044,10 @@ fn writeCodeSignaturePadding(self: *MachO) !void {
60446044
6045 const linkedit_segment = &self.load_commands.items[self.linkedit_segment_cmd_index.?].segment;6045 const linkedit_segment = &self.load_commands.items[self.linkedit_segment_cmd_index.?].segment;
6046 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].linkedit_data;6046 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].linkedit_data;
6047 const fileoff = linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize;6047 // Code signature data has to be 16-bytes aligned for Apple tools to recognize the file
6048 // https://github.com/opensource-apple/cctools/blob/fdb4825f303fd5c0751be524babd32958181b3ed/libstuff/checkout.c#L271
6049 const fileoff = mem.alignForwardGeneric(u64, linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize, 16);
6050 const padding = fileoff - (linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize);
6048 const needed_size = CodeSignature.calcCodeSignaturePaddingSize(6051 const needed_size = CodeSignature.calcCodeSignaturePaddingSize(
6049 self.base.options.emit.?.sub_path,6052 self.base.options.emit.?.sub_path,
6050 fileoff,6053 fileoff,
...@@ -6054,7 +6057,7 @@ fn writeCodeSignaturePadding(self: *MachO) !void {...@@ -6054,7 +6057,7 @@ fn writeCodeSignaturePadding(self: *MachO) !void {
6054 code_sig_cmd.datasize = needed_size;6057 code_sig_cmd.datasize = needed_size;
60556058
6056 // Advance size of __LINKEDIT segment6059 // Advance size of __LINKEDIT segment
6057 linkedit_segment.inner.filesize += needed_size;6060 linkedit_segment.inner.filesize += needed_size + padding;
6058 if (linkedit_segment.inner.vmsize < linkedit_segment.inner.filesize) {6061 if (linkedit_segment.inner.vmsize < linkedit_segment.inner.filesize) {
6059 linkedit_segment.inner.vmsize = mem.alignForwardGeneric(u64, linkedit_segment.inner.filesize, self.page_size);6062 linkedit_segment.inner.vmsize = mem.alignForwardGeneric(u64, linkedit_segment.inner.filesize, self.page_size);
6060 }6063 }