diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-08-26 13:45:28 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-08-26 13:45:28 +0200 |
| commit | 432fb7054d3214f992af5a2ef652b72d531d660b (patch) | |
| tree | 2129dc226cf0a8292c62f32554a92abcbb858a2a /src | |
| parent | d19d3342c29cc0f5d78cd91b61e5949a86811680 (diff) | |
| download | zig-432fb7054d3214f992af5a2ef652b72d531d660b.tar.gz zig-432fb7054d3214f992af5a2ef652b72d531d660b.zip | |
macho: fix stub writing in self-hosted setting
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 534ead9b42..cb030f8d12 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -2626,11 +2626,12 @@ fn resolveSymbols(self: *MachO) !void { undef.n_type |= macho.N_EXT; undef.n_desc = @intCast(u16, ordinal + 1) * macho.N_SYMBOL_RESOLVER; - if (self.unresolved.fetchSwapRemove(resolv.where_index)) |entry| { + if (self.unresolved.fetchSwapRemove(resolv.where_index)) |entry| outer_blk: { switch (entry.value) { .none => {}, .got => return error.TODOGotHint, .stub => { + if (self.stubs_map.contains(resolv.where_index)) break :outer_blk; const stub_helper_atom = blk: { const atom = try self.createStubHelperAtom(); const match = MatchingSection{ @@ -2654,7 +2655,7 @@ fn resolveSymbols(self: *MachO) !void { try self.writeAtom(atom, match); break :blk atom; }; - { + const stub_atom = blk: { const atom = try self.createStubAtom(laptr_atom.local_sym_index); const match = MatchingSection{ .seg = self.text_segment_cmd_index.?, @@ -2662,7 +2663,9 @@ fn resolveSymbols(self: *MachO) !void { }; _ = try self.allocateAtom(atom, match); try self.writeAtom(atom, match); - } + break :blk atom; + }; + try self.stubs_map.putNoClobber(self.base.allocator, resolv.where_index, stub_atom); }, } } |
