authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-19 21:55:30+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-26 11:50:09+01:00
log2bd963ad6ac83ef5b1c7499f4980a6573401ae4e
treeaf74beb9afa6dd9148b7a150ae9dc0d40b3a67a2
parent403dc50ff77a319d8d1e4ceb60bcb254e4f17f06

stage2 macho: don't pad out holes between sections


1 files changed, 10 insertions(+), 18 deletions(-)

src/link/MachO.zig+10-18
......@@ -334,8 +334,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
334334 try self.writeAllGlobalSymbols();
335335 try self.writeAllUndefSymbols();
336336
337 // TODO uncomment when we add our own codesigning mechanim
338 // try self.writeStringTable();
337 try self.writeStringTable();
339338
340339 switch (self.base.options.output_mode) {
341340 .Exe => {
......@@ -385,6 +384,8 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
385384 try self.base.file.?.pwriteAll(mem.spanZ(LIB_SYSTEM_PATH), off);
386385 self.libsystem_cmd_dirty = false;
387386 }
387
388 try self.codeSign();
388389 },
389390 .Obj => {},
390391 .Lib => return error.TODOImplementWritingLibFiles,
......@@ -397,20 +398,18 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
397398 const nundefs = @intCast(u32, self.undef_symbols.items.len);
398399 const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab;
399400 symtab.nsyms = nlocals + nglobals + nundefs;
400 // TODO could we drop this when we add our own codesigning mechanims?
401 symtab.stroff = symtab.symoff + symtab.nsyms * @sizeOf(macho.nlist_64);
402401 }
403402
404 // TODO remove when we add our own codesigning mechanism
405 try self.writeStringTable();
406 try self.codeSign();
407
408 {
409 // TODO rework how we preallocate space for the entire __LINKEDIT segment instead of
410 // doing dynamic updates like this.
403 // TODO rework how we preallocate space for the entire __LINKEDIT segment instead of
404 // doing dynamic updates like this.
405 if (self.code_signature_cmd_index) |i| {
411406 const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment;
412407 const code_sig = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;
413408 linkedit.filesize = code_sig.dataoff + code_sig.datasize - linkedit.fileoff;
409 } else {
410 const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment;
411 const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab;
412 linkedit.filesize = symtab.stroff + symtab.strsize - linkedit.fileoff;
414413 }
415414
416415 if (self.cmd_table_dirty) {
......@@ -1464,9 +1463,6 @@ pub fn populateMissingMetadata(self: *MachO) !void {
14641463
14651464 const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size);
14661465 linkedit.vmsize += segment_size;
1467 // TODO this is needed to please codesign_allocate
1468 const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo;
1469 dyld_info.export_size = off - dyld_info.export_off;
14701466 }
14711467 if (symtab.stroff == 0) {
14721468 try self.string_table.append(self.base.allocator, 0);
......@@ -1757,10 +1753,6 @@ fn writeAllUndefSymbols(self: *MachO) !void {
17571753
17581754fn codeSign(self: *MachO) !void {
17591755 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;
1760 const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab;
1761 const off = mem.alignForwardGeneric(u32, symtab.stroff + symtab.strsize, @sizeOf(u64));
1762 symtab.strsize = off - symtab.stroff;
1763 code_sig_cmd.dataoff = off;
17641756 // TODO add actual code signing mechanism
17651757 try self.base.file.?.pwriteAll(&[_]u8{ 0 }, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1);
17661758}