aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2020-11-19 21:55:30 +0100
committerJakub Konka <kubkon@jakubkonka.com>2020-11-26 11:50:09 +0100
commit2bd963ad6ac83ef5b1c7499f4980a6573401ae4e (patch)
treeaf74beb9afa6dd9148b7a150ae9dc0d40b3a67a2 /src
parent403dc50ff77a319d8d1e4ceb60bcb254e4f17f06 (diff)
downloadzig-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.zig28
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);
}