diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-19 21:55:30 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-26 11:50:09 +0100 |
| commit | 2bd963ad6ac83ef5b1c7499f4980a6573401ae4e (patch) | |
| tree | af74beb9afa6dd9148b7a150ae9dc0d40b3a67a2 /src | |
| parent | 403dc50ff77a319d8d1e4ceb60bcb254e4f17f06 (diff) | |
| download | zig-2bd963ad6ac83ef5b1c7499f4980a6573401ae4e.tar.gz zig-2bd963ad6ac83ef5b1c7499f4980a6573401ae4e.zip | |
stage2 macho: don't pad out holes between sections
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index afc1f4289c..43d84bd9e3 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -334,8 +334,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { try self.writeAllGlobalSymbols(); try self.writeAllUndefSymbols(); - // TODO uncomment when we add our own codesigning mechanim - // try self.writeStringTable(); + try self.writeStringTable(); switch (self.base.options.output_mode) { .Exe => { @@ -385,6 +384,8 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { try self.base.file.?.pwriteAll(mem.spanZ(LIB_SYSTEM_PATH), off); self.libsystem_cmd_dirty = false; } + + try self.codeSign(); }, .Obj => {}, .Lib => return error.TODOImplementWritingLibFiles, @@ -397,20 +398,18 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { const nundefs = @intCast(u32, self.undef_symbols.items.len); const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; symtab.nsyms = nlocals + nglobals + nundefs; - // TODO could we drop this when we add our own codesigning mechanims? - symtab.stroff = symtab.symoff + symtab.nsyms * @sizeOf(macho.nlist_64); } - // TODO remove when we add our own codesigning mechanism - try self.writeStringTable(); - try self.codeSign(); - - { - // TODO rework how we preallocate space for the entire __LINKEDIT segment instead of - // doing dynamic updates like this. + // TODO rework how we preallocate space for the entire __LINKEDIT segment instead of + // doing dynamic updates like this. + if (self.code_signature_cmd_index) |i| { const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; const code_sig = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; linkedit.filesize = code_sig.dataoff + code_sig.datasize - linkedit.fileoff; + } else { + const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; + const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; + linkedit.filesize = symtab.stroff + symtab.strsize - linkedit.fileoff; } if (self.cmd_table_dirty) { @@ -1464,9 +1463,6 @@ pub fn populateMissingMetadata(self: *MachO) !void { const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); linkedit.vmsize += segment_size; - // TODO this is needed to please codesign_allocate - const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; - dyld_info.export_size = off - dyld_info.export_off; } if (symtab.stroff == 0) { try self.string_table.append(self.base.allocator, 0); @@ -1757,10 +1753,6 @@ fn writeAllUndefSymbols(self: *MachO) !void { fn codeSign(self: *MachO) !void { const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData; - const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; - const off = mem.alignForwardGeneric(u32, symtab.stroff + symtab.strsize, @sizeOf(u64)); - symtab.strsize = off - symtab.stroff; - code_sig_cmd.dataoff = off; // TODO add actual code signing mechanism try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1); } |
