| ... | ... | @@ -54,6 +54,11 @@ d_sym: ?DebugSymbols = null, |
| 54 | 54 | /// For x86_64 that's 4KB, whereas for aarch64, that's 16KB. |
| 55 | 55 | page_size: u16, |
| 56 | 56 | |
| 57 | /// TODO Should we figure out embedding code signatures for other Apple platforms as part of the linker? |
| 58 | /// Or should this be a separate tool? |
| 59 | /// https://github.com/ziglang/zig/issues/9567 |
| 60 | requires_adhoc_codesig: bool, |
| 61 | |
| 57 | 62 | /// We commit 0x1000 = 4096 bytes of space to the header and |
| 58 | 63 | /// the table of load commands. This should be plenty for any |
| 59 | 64 | /// potential future extensions. |
| ... | ... | @@ -391,6 +396,13 @@ pub fn openPath(allocator: *Allocator, sub_path: []const u8, options: link.Optio |
| 391 | 396 | |
| 392 | 397 | pub fn createEmpty(gpa: *Allocator, options: link.Options) !*MachO { |
| 393 | 398 | const self = try gpa.create(MachO); |
| 399 | const cpu_arch = options.target.cpu.arch; |
| 400 | const os_tag = options.target.os.tag; |
| 401 | const abi = options.target.abi; |
| 402 | const page_size: u16 = if (cpu_arch == .aarch64) 0x4000 else 0x1000; |
| 403 | // Adhoc code signature is required when targeting aarch64-macos either directly or indirectly via the simulator |
| 404 | // ABI such as aarch64-ios-simulator, etc. |
| 405 | const requires_adhoc_codesig = cpu_arch == .aarch64 and (os_tag == .macos or abi == .simulator); |
| 394 | 406 | |
| 395 | 407 | self.* = .{ |
| 396 | 408 | .base = .{ |
| ... | ... | @@ -399,7 +411,8 @@ pub fn createEmpty(gpa: *Allocator, options: link.Options) !*MachO { |
| 399 | 411 | .allocator = gpa, |
| 400 | 412 | .file = null, |
| 401 | 413 | }, |
| 402 | | .page_size = if (options.target.cpu.arch == .aarch64) 0x4000 else 0x1000, |
| 414 | .page_size = page_size, |
| 415 | .requires_adhoc_codesig = requires_adhoc_codesig, |
| 403 | 416 | }; |
| 404 | 417 | |
| 405 | 418 | return self; |
| ... | ... | @@ -811,7 +824,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 811 | 824 | defer tracy.end(); |
| 812 | 825 | |
| 813 | 826 | const output_mode = self.base.options.output_mode; |
| 814 | | const target = self.base.options.target; |
| 815 | 827 | |
| 816 | 828 | switch (output_mode) { |
| 817 | 829 | .Exe => { |
| ... | ... | @@ -837,7 +849,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 837 | 849 | try ds.flushModule(self.base.allocator, self.base.options); |
| 838 | 850 | } |
| 839 | 851 | |
| 840 | | if (target.cpu.arch == .aarch64) { |
| 852 | if (self.requires_adhoc_codesig) { |
| 841 | 853 | // Preallocate space for the code signature. |
| 842 | 854 | // We need to do this at this stage so that we have the load commands with proper values |
| 843 | 855 | // written out to the file. |
| ... | ... | @@ -870,11 +882,8 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 870 | 882 | assert(!self.strtab_dirty); |
| 871 | 883 | assert(!self.strtab_needs_relocation); |
| 872 | 884 | |
| 873 | | if (target.cpu.arch == .aarch64) { |
| 874 | | switch (output_mode) { |
| 875 | | .Exe, .Lib => try self.writeCodeSignature(), // code signing always comes last |
| 876 | | else => {}, |
| 877 | | } |
| 885 | if (self.requires_adhoc_codesig) { |
| 886 | try self.writeCodeSignature(); // code signing always comes last |
| 878 | 887 | } |
| 879 | 888 | } |
| 880 | 889 | |
| ... | ... | @@ -2831,7 +2840,7 @@ fn addDataInCodeLC(self: *MachO) !void { |
| 2831 | 2840 | } |
| 2832 | 2841 | |
| 2833 | 2842 | fn addCodeSignatureLC(self: *MachO) !void { |
| 2834 | | if (self.code_signature_cmd_index == null and self.base.options.target.cpu.arch == .aarch64) { |
| 2843 | if (self.code_signature_cmd_index == null and self.requires_adhoc_codesig) { |
| 2835 | 2844 | self.code_signature_cmd_index = @intCast(u16, self.load_commands.items.len); |
| 2836 | 2845 | try self.load_commands.append(self.base.allocator, .{ |
| 2837 | 2846 | .LinkeditData = .{ |
| ... | ... | @@ -2925,14 +2934,14 @@ fn flushZld(self: *MachO) !void { |
| 2925 | 2934 | seg.inner.vmsize = mem.alignForwardGeneric(u64, seg.inner.filesize, self.page_size); |
| 2926 | 2935 | } |
| 2927 | 2936 | |
| 2928 | | if (self.base.options.target.cpu.arch == .aarch64) { |
| 2937 | if (self.requires_adhoc_codesig) { |
| 2929 | 2938 | try self.writeCodeSignaturePadding(); |
| 2930 | 2939 | } |
| 2931 | 2940 | |
| 2932 | 2941 | try self.writeLoadCommands(); |
| 2933 | 2942 | try self.writeHeader(); |
| 2934 | 2943 | |
| 2935 | | if (self.base.options.target.cpu.arch == .aarch64) { |
| 2944 | if (self.requires_adhoc_codesig) { |
| 2936 | 2945 | try self.writeCodeSignature(); |
| 2937 | 2946 | } |
| 2938 | 2947 | } |
| ... | ... | @@ -4444,7 +4453,7 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 4444 | 4453 | try self.load_commands.append(self.base.allocator, .{ .Uuid = uuid_cmd }); |
| 4445 | 4454 | self.load_commands_dirty = true; |
| 4446 | 4455 | } |
| 4447 | | if (self.code_signature_cmd_index == null) { |
| 4456 | if (self.code_signature_cmd_index == null and self.requires_adhoc_codesig) { |
| 4448 | 4457 | self.code_signature_cmd_index = @intCast(u16, self.load_commands.items.len); |
| 4449 | 4458 | try self.load_commands.append(self.base.allocator, .{ |
| 4450 | 4459 | .LinkeditData = .{ |
| ... | ... | @@ -5709,8 +5718,8 @@ fn writeStringTableZld(self: *MachO) !void { |
| 5709 | 5718 | |
| 5710 | 5719 | try self.base.file.?.pwriteAll(self.strtab.items, symtab.stroff); |
| 5711 | 5720 | |
| 5712 | | if (symtab.strsize > self.strtab.items.len and self.base.options.target.cpu.arch == .x86_64) { |
| 5713 | | // This is the last section, so we need to pad it out. |
| 5721 | if (symtab.strsize > self.strtab.items.len) { |
| 5722 | // This is potentially the last section, so we need to pad it out. |
| 5714 | 5723 | try self.base.file.?.pwriteAll(&[_]u8{0}, seg.inner.fileoff + seg.inner.filesize - 1); |
| 5715 | 5724 | } |
| 5716 | 5725 | } |