authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-08 12:47:48-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-08 12:47:48-07:00
loga482b82e2d4fdcd0a9a8683e403ced789c7f98a3
tree474029faeaf703387232fb8c12d233b864a00c42
parent97c0e1cc41c24c6cbb60117751d5b82dcd9d0e43

stage2: only patch up LLD binaries on aarch64-macos

The code is a bit fragile so it was causing CI failures on x86_64-macos. Also the patch up code is only needed for aarch64-macos, so we were doing unnecessary work.

1 files changed, 39 insertions(+), 36 deletions(-)

src/link/MachO.zig+39-36
...@@ -725,43 +725,46 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {...@@ -725,43 +725,46 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {
725725
726 // At this stage, LLD has done its job. It is time to patch the resultant726 // At this stage, LLD has done its job. It is time to patch the resultant
727 // binaries up!727 // binaries up!
728 const out_file = try directory.handle.openFile(self.base.options.emit.?.sub_path, .{ .write = true });728 // This is currently needed only for aarch64 targets.
729 try self.parseFromFile(out_file);729 if (target.cpu.arch == .aarch64) {
730 if (self.code_signature_cmd_index == null) {730 const out_file = try directory.handle.openFile(self.base.options.emit.?.sub_path, .{ .write = true });
731 const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;731 try self.parseFromFile(out_file);
732 const text_section = text_segment.sections.items[self.text_section_index.?];732 if (self.code_signature_cmd_index == null) {
733 const after_last_cmd_offset = self.header.?.sizeofcmds + @sizeOf(macho.mach_header_64);733 const text_segment = self.load_commands.items[self.text_segment_cmd_index.?].Segment;
734 const needed_size = @sizeOf(macho.linkedit_data_command);734 const text_section = text_segment.sections.items[self.text_section_index.?];
735 if (needed_size + after_last_cmd_offset > text_section.offset) {735 const after_last_cmd_offset = self.header.?.sizeofcmds + @sizeOf(macho.mach_header_64);
736 // TODO We are in the position to be able to increase the padding by moving all sections736 const needed_size = @sizeOf(macho.linkedit_data_command);
737 // by the required offset, but this requires a little bit more thinking and bookkeeping.737 if (needed_size + after_last_cmd_offset > text_section.offset) {
738 // For now, return an error informing the user of the problem.738 // TODO We are in the position to be able to increase the padding by moving all sections
739 std.log.err("Not enough padding between load commands and start of __text section:\n", .{});739 // by the required offset, but this requires a little bit more thinking and bookkeeping.
740 std.log.err("Offset after last load command: 0x{x}\n", .{after_last_cmd_offset});740 // For now, return an error informing the user of the problem.
741 std.log.err("Beginning of __text section: 0x{x}\n", .{text_section.offset});741 std.log.err("Not enough padding between load commands and start of __text section:\n", .{});
742 std.log.err("Needed size: 0x{x}\n", .{needed_size});742 std.log.err("Offset after last load command: 0x{x}\n", .{after_last_cmd_offset});
743 return error.NotEnoughPadding;743 std.log.err("Beginning of __text section: 0x{x}\n", .{text_section.offset});
744 std.log.err("Needed size: 0x{x}\n", .{needed_size});
745 return error.NotEnoughPadding;
746 }
747 const linkedit_segment = self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment;
748 // TODO This is clunky.
749 self.linkedit_segment_next_offset = @intCast(u32, mem.alignForwardGeneric(u64, linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize, @sizeOf(u64)));
750 // Add code signature load command
751 self.code_signature_cmd_index = @intCast(u16, self.load_commands.items.len);
752 try self.load_commands.append(self.base.allocator, .{
753 .LinkeditData = .{
754 .cmd = macho.LC_CODE_SIGNATURE,
755 .cmdsize = @sizeOf(macho.linkedit_data_command),
756 .dataoff = 0,
757 .datasize = 0,
758 },
759 });
760 // Pad out space for code signature
761 try self.writeCodeSignaturePadding();
762 // Write updated load commands and the header
763 try self.writeLoadCommands();
764 try self.writeHeader();
765 // Generate adhoc code signature
766 try self.writeCodeSignature();
744 }767 }
745 const linkedit_segment = self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment;
746 // TODO This is clunky.
747 self.linkedit_segment_next_offset = @intCast(u32, mem.alignForwardGeneric(u64, linkedit_segment.inner.fileoff + linkedit_segment.inner.filesize, @sizeOf(u64)));
748 // Add code signature load command
749 self.code_signature_cmd_index = @intCast(u16, self.load_commands.items.len);
750 try self.load_commands.append(self.base.allocator, .{
751 .LinkeditData = .{
752 .cmd = macho.LC_CODE_SIGNATURE,
753 .cmdsize = @sizeOf(macho.linkedit_data_command),
754 .dataoff = 0,
755 .datasize = 0,
756 },
757 });
758 // Pad out space for code signature
759 try self.writeCodeSignaturePadding();
760 // Write updated load commands and the header
761 try self.writeLoadCommands();
762 try self.writeHeader();
763 // Generate adhoc code signature
764 try self.writeCodeSignature();
765 }768 }
766 }769 }
767 }770 }