authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-20 00:35:46+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-26 11:50:09+01:00
log3ac804628f26ad889701e746d44b21d369cff98d
tree9a5c9034855813a9a8cd4bd1a9ac09bcda4b8c9a
parent2bd963ad6ac83ef5b1c7499f4980a6573401ae4e

stage2 macho: write out constants in CS


1 files changed, 51 insertions(+), 0 deletions(-)

src/link/MachO.zig+51
...@@ -1754,6 +1754,57 @@ fn writeAllUndefSymbols(self: *MachO) !void {...@@ -1754,6 +1754,57 @@ fn writeAllUndefSymbols(self: *MachO) !void {
1754fn codeSign(self: *MachO) !void {1754fn codeSign(self: *MachO) !void {
1755 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;1755 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;
1756 // TODO add actual code signing mechanism1756 // TODO add actual code signing mechanism
1757 var buffer: std.ArrayListUnmanaged(u8) = .{};
1758 defer buffer.deinit(self.base.allocator);
1759 // var super_blob = macho.SuperBlob{
1760 // .magic = macho.CSMAGIC_EMBEDDED_SIGNATURE,
1761 // .length = 0,
1762 // .count = 2,
1763 // };
1764 const length: u32 = @sizeOf(u32) * 12;
1765 try buffer.ensureCapacity(self.base.allocator, length);
1766 var buf: [@sizeOf(u32)]u8 = undefined;
1767 mem.writeIntBig(u32, &buf, macho.CSMAGIC_EMBEDDED_SIGNATURE);
1768 buffer.appendSliceAssumeCapacity(buf[0..]);
1769 mem.writeIntBig(u32, &buf, length);
1770 buffer.appendSliceAssumeCapacity(buf[0..]);
1771 mem.writeIntBig(u32, &buf, 2);
1772 buffer.appendSliceAssumeCapacity(buf[0..]);
1773 // macho.BlobIndex{
1774 // .type = macho.CSSLOT_REQUIREMENTS,
1775 // .offset = offset,
1776 // };
1777 mem.writeIntBig(u32, &buf, macho.CSSLOT_REQUIREMENTS);
1778 buffer.appendSliceAssumeCapacity(buf[0..]);
1779 mem.writeIntBig(u32, &buf, 28);
1780 buffer.appendSliceAssumeCapacity(buf[0..]);
1781 // macho.BlobIndex{
1782 // .type = macho.CSSLOT_SIGNATURESLOT,
1783 // .offset = offset,
1784 // };
1785 mem.writeIntBig(u32, &buf, macho.CSSLOT_SIGNATURESLOT);
1786 buffer.appendSliceAssumeCapacity(buf[0..]);
1787 mem.writeIntBig(u32, &buf, 40);
1788 buffer.appendSliceAssumeCapacity(buf[0..]);
1789 // const requirements_blob = macho.GenericBlob{
1790 // .magic = macho.CSMAGIC_REQUIREMENTS,
1791 // .length = 0,
1792 // };
1793 mem.writeIntBig(u32, &buf, macho.CSMAGIC_REQUIREMENTS);
1794 buffer.appendSliceAssumeCapacity(buf[0..]);
1795 mem.writeIntBig(u32, &buf, @sizeOf(u32) * 3);
1796 buffer.appendSliceAssumeCapacity(buf[0..]);
1797 mem.writeIntBig(u32, &buf, 0);
1798 buffer.appendSliceAssumeCapacity(buf[0..]);
1799 // const signature_blob = macho.GenericBlob{
1800 // .magic = macho.CSSLOT_SIGNATURESLOT,
1801 // .length = 0,
1802 // };
1803 mem.writeIntBig(u32, &buf, macho.CSMAGIC_BLOBWRAPPER);
1804 buffer.appendSliceAssumeCapacity(buf[0..]);
1805 mem.writeIntBig(u32, &buf, @sizeOf(u32) * 2);
1806 buffer.appendSliceAssumeCapacity(buf[0..]);
1807 try self.base.file.?.pwriteAll(buffer.items[0..], code_sig_cmd.dataoff);
1757 try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1);1808 try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1);
1758}1809}
17591810