| ... | ... | @@ -408,6 +408,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 408 | 408 | try self.writeLazyBindingInfoTable(); |
| 409 | 409 | try self.writeExportTrie(); |
| 410 | 410 | try self.writeAllGlobalAndUndefSymbols(); |
| 411 | try self.writeIndirectSymbolTable(); |
| 411 | 412 | try self.writeStringTable(); |
| 412 | 413 | try self.updateLinkeditSegmentSizes(); |
| 413 | 414 | |
| ... | ... | @@ -429,11 +430,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 429 | 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 | 433 | try self.writeLoadCommands(); |
| 438 | 434 | try self.writeHeader(); |
| 439 | 435 | |
| ... | ... | @@ -2534,6 +2530,32 @@ fn writeAllGlobalAndUndefSymbols(self: *MachO) !void { |
| 2534 | 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 | 2559 | fn writeCodeSignaturePadding(self: *MachO) !void { |
| 2538 | 2560 | const tracy = trace(@src()); |
| 2539 | 2561 | defer tracy.end(); |