authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-01-06 17:45:26+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-01-13 23:54:22+01:00
logbb691ea16b89c29d98cc2d36bf2af029c5dd1844
tree10997a5b376584e0a7c463af4f8c7a73a24d48e0
parent6d2a6513f963780fe88235218213dee4b1a0a7dd

macho: first working draft of externs on macOS


1 files changed, 27 insertions(+), 5 deletions(-)

src/link/MachO.zig+27-5
...@@ -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();
413414
...@@ -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 }
431432
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();
439435
...@@ -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}
25362532
2533fn 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
2537fn writeCodeSignaturePadding(self: *MachO) !void {2559fn writeCodeSignaturePadding(self: *MachO) !void {
2538 const tracy = trace(@src());2560 const tracy = trace(@src());
2539 defer tracy.end();2561 defer tracy.end();