aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-08-26 13:45:28 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-08-26 13:45:28 +0200
commit432fb7054d3214f992af5a2ef652b72d531d660b (patch)
tree2129dc226cf0a8292c62f32554a92abcbb858a2a /src
parentd19d3342c29cc0f5d78cd91b61e5949a86811680 (diff)
downloadzig-432fb7054d3214f992af5a2ef652b72d531d660b.tar.gz
zig-432fb7054d3214f992af5a2ef652b72d531d660b.zip
macho: fix stub writing in self-hosted setting
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO.zig9
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);
},
}
}