diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-20 11:50:44 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-26 11:50:09 +0100 |
| commit | 9dcf7ee9c904b25fbffd264cabeb6638e9d9e2d6 (patch) | |
| tree | b15b3c0bcc0708e44e8009b15a4c0dc72f723a6a | |
| parent | 79381dc4fb1f7eb92b5e01d21f866f550ca3ff20 (diff) | |
| download | zig-9dcf7ee9c904b25fbffd264cabeb6638e9d9e2d6.tar.gz zig-9dcf7ee9c904b25fbffd264cabeb6638e9d9e2d6.zip | |
stage2 macho: add info about __TEXT segment
| -rw-r--r-- | lib/std/macho.zig | 8 | ||||
| -rw-r--r-- | src/link/MachO.zig | 2 | ||||
| -rw-r--r-- | src/link/MachO/CodeSignature.zig | 18 |
3 files changed, 17 insertions, 11 deletions
diff --git a/lib/std/macho.zig b/lib/std/macho.zig index 4a54b6b9c5..79378ef5a4 100644 --- a/lib/std/macho.zig +++ b/lib/std/macho.zig @@ -1402,6 +1402,10 @@ pub const CS_SIGNER_TYPE_UNKNOWN: u32 = 0; pub const CS_SIGNER_TYPE_LEGACYVPN: u32 = 5; pub const CS_SIGNER_TYPE_MAC_APP_STORE: u32 = 6; +pub const CS_ADHOC: u32 = 0x2; + +pub const CS_EXECSEG_MAIN_BINARY: u32 = 0x1; + /// This CodeDirectory is tailored specfically at version 0x20400. pub const CodeDirectory = extern struct { /// Magic number (CSMAGIC_CODEDIRECTORY) @@ -1488,8 +1492,6 @@ pub const SuperBlob = extern struct { /// Number of index BlobIndex entries following this struct count: u32, - - // index: []const BlobIndex, }; pub const GenericBlob = extern struct { @@ -1498,6 +1500,4 @@ pub const GenericBlob = extern struct { /// Total length of blob length: u32, - - // data: []const u8, }; diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 431dcf714c..f77f05fb33 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -1758,7 +1758,7 @@ fn writecodeSignature(self: *MachO) !void { var code_sig = CodeSignature.init(self.base.allocator); defer code_sig.deinit(); - try code_sig.calcAdhocSignature(); + try code_sig.calcAdhocSignature(self); var buffer = try self.base.allocator.alloc(u8, code_sig.size()); defer self.base.allocator.free(buffer); diff --git a/src/link/MachO/CodeSignature.zig b/src/link/MachO/CodeSignature.zig index fbc67dbabd..25b1e9e9ff 100644 --- a/src/link/MachO/CodeSignature.zig +++ b/src/link/MachO/CodeSignature.zig @@ -8,6 +8,8 @@ const mem = std.mem; const testing = std.testing; const Allocator = mem.Allocator; +const MachO = @import("../MachO.zig"); + const Blob = struct { inner: macho.CodeDirectory, data: std.ArrayListUnmanaged(u8) = .{}, @@ -56,13 +58,17 @@ pub fn init(alloc: *Allocator) CodeSignature { }; } -pub fn calcAdhocSignature(self: *CodeSignature) !void { +pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void { + const text_segment = bin_file.load_commands.items[bin_file.text_segment_cmd_index.?].Segment; + const execSegBase: u64 = text_segment.fileoff; + const execSegLimit: u64 = text_segment.filesize; + const execSegFlags: u64 = text_segment.flags; var blob = Blob{ .inner = .{ .magic = macho.CSMAGIC_CODEDIRECTORY, .length = @sizeOf(macho.CodeDirectory), - .version = 0x20400, - .flags = 0, + .version = macho.CS_SUPPORTSEXECSEG, + .flags = macho.CS_ADHOC, .hashOffset = 0, .identOffset = 0, .nSpecialSlots = 0, @@ -77,9 +83,9 @@ pub fn calcAdhocSignature(self: *CodeSignature) !void { .teamOffset = 0, .spare3 = 0, .codeLimit64 = 0, - .execSegBase = 0, - .execSegLimit = 0, - .execSegFlags = 0, + .execSegBase = execSegBase, + .execSegLimit = execSegLimit, + .execSegFlags = execSegFlags, }, }; self.inner.length += @sizeOf(macho.BlobIndex) + blob.size(); |
