diff options
| -rw-r--r-- | src/link/MachO.zig | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 77cbd10dc3..eb747beff8 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -408,6 +408,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { try self.writeLazyBindingInfoTable(); try self.writeExportTrie(); try self.writeAllGlobalAndUndefSymbols(); + try self.writeIndirectSymbolTable(); try self.writeStringTable(); try self.updateLinkeditSegmentSizes(); @@ -429,11 +430,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { .Lib => return error.TODOImplementWritingLibFiles, } - { - const dysymtab = &self.load_commands.items[self.dysymtab_cmd_index.?].Dysymtab; - dysymtab.nindirectsyms = 0; - } - try self.writeLoadCommands(); try self.writeHeader(); @@ -2534,6 +2530,32 @@ fn writeAllGlobalAndUndefSymbols(self: *MachO) !void { self.load_commands_dirty = true; } +fn writeIndirectSymbolTable(self: *MachO) !void { + const text_seg = &self.load_commands.items[self.text_segment_cmd_index.?].Segment; + const stubs = &text_seg.sections.items[self.stubs_section_index.?]; + const dc_seg = &self.load_commands.items[self.data_const_segment_cmd_index.?].Segment; + const got = &dc_seg.sections.items[self.data_got_section_index.?]; + const data_seg = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; + const la = &data_seg.sections.items[self.la_symbol_ptr_section_index.?]; + const dysymtab = &self.load_commands.items[self.dysymtab_cmd_index.?].Dysymtab; + dysymtab.nindirectsyms = 0; + for (self.undef_symbols.items) |sym, i| { + const idx = @intCast(u32, dysymtab.iundefsym + i); + var buf: [@sizeOf(u32)]u8 = undefined; + mem.writeIntLittle(u32, &buf, idx); + try self.base.file.?.pwriteAll(&buf, dysymtab.indirectsymoff + i * @sizeOf(u32)); + dysymtab.nindirectsyms += 1; + if (i == self.dyld_stub_binder_index.?) { + got.reserved1 = @intCast(u32, i); + continue; + } + stubs.reserved1 = @intCast(u32, i); + try self.base.file.?.pwriteAll(&buf, dysymtab.indirectsymoff + (i + 1) * @sizeOf(u32)); + la.reserved1 = @intCast(u32, i + 1); + dysymtab.nindirectsyms += 1; + } +} + fn writeCodeSignaturePadding(self: *MachO) !void { const tracy = trace(@src()); defer tracy.end(); |
