stage2 macho: add info about __TEXT segment

master
Jakub Konka 2020-11-20 11:50:44 +01:00
parent 79381dc4fb
commit 9dcf7ee9c9
3 changed files with 17 additions and 11 deletions

View File

@ -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,
};

View File

@ -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);

View File

@ -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();