Commit 57d7ad9172

Jakub Konka <kubkon@jakubkonka.com>
2022-01-14 22:32:33
macho: code signature needs to be 16 bytes aligned
1 parent e67e15a
Changed files (1)
src
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);
     }