diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-30 00:08:18 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-30 13:56:08 +0100 |
| commit | b8490c05c10193363107a1fb2e7c4ffab287f5ad (patch) | |
| tree | 00b05680a984e2dfad2f4f1bec815574763bd90f /src | |
| parent | a2ad8517eea597eb9d7215aef831a86ffd16d1b3 (diff) | |
| download | zig-b8490c05c10193363107a1fb2e7c4ffab287f5ad.tar.gz zig-b8490c05c10193363107a1fb2e7c4ffab287f5ad.zip | |
macho: improve weak-ref symbols handling
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO/Dylib.zig | 3 | ||||
| -rw-r--r-- | src/link/MachO/Object.zig | 5 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 2 |
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; } } |
