| ... | @@ -408,6 +408,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { | ... | @@ -408,6 +408,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 408 | try self.writeLazyBindingInfoTable(); | 408 | try self.writeLazyBindingInfoTable(); |
| 409 | try self.writeExportTrie(); | 409 | try self.writeExportTrie(); |
| 410 | try self.writeAllGlobalAndUndefSymbols(); | 410 | try self.writeAllGlobalAndUndefSymbols(); |
| | 411 | try self.writeIndirectSymbolTable(); |
| 411 | try self.writeStringTable(); | 412 | try self.writeStringTable(); |
| 412 | try self.updateLinkeditSegmentSizes(); | 413 | try self.updateLinkeditSegmentSizes(); |
| 413 | | 414 | |
| ... | @@ -429,11 +430,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { | ... | @@ -429,11 +430,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 429 | .Lib => return error.TODOImplementWritingLibFiles, | 430 | .Lib => return error.TODOImplementWritingLibFiles, |
| 430 | } | 431 | } |
| 431 | | 432 | |
| 432 | { | | |
| 433 | const dysymtab = &self.load_commands.items[self.dysymtab_cmd_index.?].Dysymtab; | | |
| 434 | dysymtab.nindirectsyms = 0; | | |
| 435 | } | | |
| 436 | | | |
| 437 | try self.writeLoadCommands(); | 433 | try self.writeLoadCommands(); |
| 438 | try self.writeHeader(); | 434 | try self.writeHeader(); |
| 439 | | 435 | |
| ... | @@ -2534,6 +2530,32 @@ fn writeAllGlobalAndUndefSymbols(self: *MachO) !void { | ... | @@ -2534,6 +2530,32 @@ fn writeAllGlobalAndUndefSymbols(self: *MachO) !void { |
| 2534 | self.load_commands_dirty = true; | 2530 | self.load_commands_dirty = true; |
| 2535 | } | 2531 | } |
| 2536 | | 2532 | |
| | 2533 | fn writeIndirectSymbolTable(self: *MachO) !void { |
| | 2534 | const text_seg = &self.load_commands.items[self.text_segment_cmd_index.?].Segment; |
| | 2535 | const stubs = &text_seg.sections.items[self.stubs_section_index.?]; |
| | 2536 | const dc_seg = &self.load_commands.items[self.data_const_segment_cmd_index.?].Segment; |
| | 2537 | const got = &dc_seg.sections.items[self.data_got_section_index.?]; |
| | 2538 | const data_seg = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| | 2539 | const la = &data_seg.sections.items[self.la_symbol_ptr_section_index.?]; |
| | 2540 | const dysymtab = &self.load_commands.items[self.dysymtab_cmd_index.?].Dysymtab; |
| | 2541 | dysymtab.nindirectsyms = 0; |
| | 2542 | for (self.undef_symbols.items) |sym, i| { |
| | 2543 | const idx = @intCast(u32, dysymtab.iundefsym + i); |
| | 2544 | var buf: [@sizeOf(u32)]u8 = undefined; |
| | 2545 | mem.writeIntLittle(u32, &buf, idx); |
| | 2546 | try self.base.file.?.pwriteAll(&buf, dysymtab.indirectsymoff + i * @sizeOf(u32)); |
| | 2547 | dysymtab.nindirectsyms += 1; |
| | 2548 | if (i == self.dyld_stub_binder_index.?) { |
| | 2549 | got.reserved1 = @intCast(u32, i); |
| | 2550 | continue; |
| | 2551 | } |
| | 2552 | stubs.reserved1 = @intCast(u32, i); |
| | 2553 | try self.base.file.?.pwriteAll(&buf, dysymtab.indirectsymoff + (i + 1) * @sizeOf(u32)); |
| | 2554 | la.reserved1 = @intCast(u32, i + 1); |
| | 2555 | dysymtab.nindirectsyms += 1; |
| | 2556 | } |
| | 2557 | } |
| | 2558 | |
| 2537 | fn writeCodeSignaturePadding(self: *MachO) !void { | 2559 | fn writeCodeSignaturePadding(self: *MachO) !void { |
| 2538 | const tracy = trace(@src()); | 2560 | const tracy = trace(@src()); |
| 2539 | defer tracy.end(); | 2561 | defer tracy.end(); |