aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-30 00:08:18 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-30 13:56:08 +0100
commitb8490c05c10193363107a1fb2e7c4ffab287f5ad (patch)
tree00b05680a984e2dfad2f4f1bec815574763bd90f /src
parenta2ad8517eea597eb9d7215aef831a86ffd16d1b3 (diff)
downloadzig-b8490c05c10193363107a1fb2e7c4ffab287f5ad.tar.gz
zig-b8490c05c10193363107a1fb2e7c4ffab287f5ad.zip
macho: improve weak-ref symbols handling
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO/Dylib.zig3
-rw-r--r--src/link/MachO/Object.zig5
-rw-r--r--src/link/MachO/ZigObject.zig2
3 files changed, 9 insertions, 1 deletions
diff --git a/src/link/MachO/Dylib.zig b/src/link/MachO/Dylib.zig
index 32f7a018a2..52f3c782eb 100644
--- a/src/link/MachO/Dylib.zig
+++ b/src/link/MachO/Dylib.zig
@@ -520,7 +520,6 @@ pub fn resolveSymbols(self: *Dylib, macho_file: *MachO) void {
global.nlist_idx = 0;
global.file = self.index;
global.flags.weak = flags.weak;
- global.flags.weak_ref = false;
global.flags.tlv = flags.tlv;
global.flags.dyn_ref = false;
global.flags.tentative = false;
@@ -534,9 +533,11 @@ pub fn resetGlobals(self: *Dylib, macho_file: *MachO) void {
const sym = macho_file.getSymbol(sym_index);
const name = sym.name;
const global = sym.flags.global;
+ const weak_ref = sym.flags.weak_ref;
sym.* = .{};
sym.name = name;
sym.flags.global = global;
+ sym.flags.weak_ref = weak_ref;
}
}
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig
index d6c5010b31..642e1a0475 100644
--- a/src/link/MachO/Object.zig
+++ b/src/link/MachO/Object.zig
@@ -525,6 +525,9 @@ fn initSymbols(self: *Object, macho_file: *MachO) !void {
const off = try macho_file.strings.insert(gpa, name);
const gop = try macho_file.getOrCreateGlobal(off);
self.symbols.addOneAssumeCapacity().* = gop.index;
+ if (nlist.undf() and nlist.weakRef()) {
+ macho_file.getSymbol(gop.index).flags.weak_ref = true;
+ }
continue;
}
@@ -1099,9 +1102,11 @@ pub fn resetGlobals(self: *Object, macho_file: *MachO) void {
const sym = macho_file.getSymbol(sym_index);
const name = sym.name;
const global = sym.flags.global;
+ const weak_ref = sym.flags.weak_ref;
sym.* = .{};
sym.name = name;
sym.flags.global = global;
+ sym.flags.weak_ref = weak_ref;
}
}
diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig
index f903c997fb..c05a03e673 100644
--- a/src/link/MachO/ZigObject.zig
+++ b/src/link/MachO/ZigObject.zig
@@ -233,9 +233,11 @@ pub fn resetGlobals(self: *ZigObject, macho_file: *MachO) void {
const sym = macho_file.getSymbol(sym_index);
const name = sym.name;
const global = sym.flags.global;
+ const weak_ref = sym.flags.weak_ref;
sym.* = .{};
sym.name = name;
sym.flags.global = global;
+ sym.flags.weak_ref = weak_ref;
}
}