diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig index 67620711d3..e8d74695e0 100644 --- a/src/link/MachO/zld.zig +++ b/src/link/MachO/zld.zig @@ -73,7 +73,7 @@ pub const Zld = struct { mh_execute_header_index: ?u32 = null, dso_handle_index: ?u32 = null, dyld_stub_binder_index: ?u32 = null, - dyld_private_sym_index: ?u32 = null, + dyld_private_atom_index: ?Atom.Index = null, stub_helper_preamble_sym_index: ?u32 = null, strtab: StringTable(.strtab) = .{}, @@ -324,8 +324,6 @@ pub const Zld = struct { } fn createDyldPrivateAtom(self: *Zld) !void { - if (self.dyld_stub_binder_index == null) return; - const sym_index = try self.allocateSymbol(); const atom_index = try self.createEmptyAtom(sym_index, @sizeOf(u64), 3); const sym = self.getSymbolPtr(.{ .sym_index = sym_index }); @@ -333,8 +331,7 @@ pub const Zld = struct { const sect_id = self.getSectionByName("__DATA", "__data") orelse try self.initSection("__DATA", "__data", .{}); sym.n_sect = sect_id + 1; - - self.dyld_private_sym_index = sym_index; + self.dyld_private_atom_index = atom_index; self.addAtomToSection(atom_index); } @@ -378,7 +375,8 @@ pub const Zld = struct { break :blk sym.n_value; }; const dyld_private_addr = blk: { - const sym = self.getSymbol(.{ .sym_index = self.dyld_private_sym_index.? }); + const atom = self.getAtom(self.dyld_private_atom_index.?); + const sym = self.getSymbol(atom.getSymbolWithLoc()); break :blk sym.n_value; }; const dyld_stub_binder_got_addr = blk: { @@ -1054,13 +1052,9 @@ pub const Zld = struct { const offset = buffer.items.len; // TODO: move writing synthetic sections into a separate function - if (atom.getFile() == null) outer: { - if (self.dyld_private_sym_index) |sym_index| { - if (atom.sym_index == sym_index) { - buffer.appendSliceAssumeCapacity(&[_]u8{0} ** @sizeOf(u64)); - break :outer; - } - } + if (atom_index == self.dyld_private_atom_index.?) { + buffer.appendSliceAssumeCapacity(&[_]u8{0} ** @sizeOf(u64)); + } else if (atom.getFile() == null) outer: { switch (header.type()) { macho.S_NON_LAZY_SYMBOL_POINTERS => { try self.writeGotPointer(count, buffer.writer()); @@ -1544,9 +1538,7 @@ pub const Zld = struct { const sym = self.getSymbol(atom.getSymbolWithLoc()); const should_rebase = blk: { - if (self.dyld_private_sym_index) |sym_index| { - if (atom.getFile() == null and atom.sym_index == sym_index) break :blk false; - } + if (atom_index == self.dyld_private_atom_index.?) break :blk false; break :blk !sym.undf(); }; @@ -1684,9 +1676,7 @@ pub const Zld = struct { log.debug(" ATOM({d}, %{d}, '{s}')", .{ atom_index, atom.sym_index, self.getSymbolName(atom.getSymbolWithLoc()) }); const should_bind = blk: { - if (self.dyld_private_sym_index) |sym_index| { - if (atom.getFile() == null and atom.sym_index == sym_index) break :blk false; - } + if (atom_index == self.dyld_private_atom_index.?) break :blk false; break :blk true; };