authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-14 22:32:33+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-02 21:10:23-07:00
log57d7ad9172497dd1e341f5c37228544f38e3959d
tree9bbcdac9b38dbf410551d7646dab2debf7c68ac7
parente67e15a29a8a25c8ab03b07977776ae0c4bbba35

macho: code signature needs to be 16 bytes aligned


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

src/link/MachO.zig+5-2
...@@ -5774,7 +5774,10 @@ fn writeCodeSignaturePadding(self: *MachO) !void {...@@ -5774,7 +5774,10 @@ fn writeCodeSignaturePadding(self: *MachO) !void {
57745774
5775 const linkedit_segment = &self.load_commands.items[self.linkedit_segment_cmd_index.?].segment;5775 const linkedit_segment = &self.load_commands.items[self.linkedit_segment_cmd_index.?].segment;
5776 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].linkedit_data;5776 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].linkedit_data;
5777 const fileoff = linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize;5777 // Code signature data has to be 16-bytes aligned for Apple tools to recognize the file
5778 // https://github.com/opensource-apple/cctools/blob/fdb4825f303fd5c0751be524babd32958181b3ed/libstuff/checkout.c#L271
5779 const fileoff = mem.alignForwardGeneric(u64, linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize, 16);
5780 const padding = fileoff - (linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize);
5778 const needed_size = CodeSignature.calcCodeSignaturePaddingSize(5781 const needed_size = CodeSignature.calcCodeSignaturePaddingSize(
5779 self.base.options.emit.?.sub_path,5782 self.base.options.emit.?.sub_path,
5780 fileoff,5783 fileoff,
...@@ -5784,7 +5787,7 @@ fn writeCodeSignaturePadding(self: *MachO) !void {...@@ -5784,7 +5787,7 @@ fn writeCodeSignaturePadding(self: *MachO) !void {
5784 code_sig_cmd.datasize = needed_size;5787 code_sig_cmd.datasize = needed_size;
57855788
5786 // Advance size of __LINKEDIT segment5789 // Advance size of __LINKEDIT segment
5787 linkedit_segment.inner.filesize += needed_size;5790 linkedit_segment.inner.filesize += needed_size + padding;
5788 if (linkedit_segment.inner.vmsize < linkedit_segment.inner.filesize) {5791 if (linkedit_segment.inner.vmsize < linkedit_segment.inner.filesize) {
5789 linkedit_segment.inner.vmsize = mem.alignForwardGeneric(u64, linkedit_segment.inner.filesize, self.page_size);5792 linkedit_segment.inner.vmsize = mem.alignForwardGeneric(u64, linkedit_segment.inner.filesize, self.page_size);
5790 }5793 }