diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-11 14:49:16 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-18 09:13:08 +0200 |
| commit | 90c54f1eb6d34fb703b6c4e093580a0f2f70d559 (patch) | |
| tree | 7e0a3416b09d81f61ac95c539b6fa22165a53822 /src/link | |
| parent | 3d58faed12d018d70a4cd28aff89b733621a0259 (diff) | |
| download | zig-90c54f1eb6d34fb703b6c4e093580a0f2f70d559.tar.gz zig-90c54f1eb6d34fb703b6c4e093580a0f2f70d559.zip | |
macho: fix symbol visibility merging logic
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/MachO/Object.zig | 2 | ||||
| -rw-r--r-- | src/link/MachO/Symbol.zig | 15 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 2 |
3 files changed, 16 insertions, 3 deletions
diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index dc62bc6500..d283b35a88 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -1536,7 +1536,7 @@ pub fn mergeSymbolVisibility(self: *Object, macho_file: *MachO) void { for (self.symbols.items, 0..) |sym, i| { const ref = self.getSymbolRef(@intCast(i), macho_file); const global = ref.getSymbol(macho_file) orelse continue; - if (global.visibility != .global) { + if (sym.visibility.rank() < global.visibility.rank()) { global.visibility = sym.visibility; } if (sym.flags.weak_ref) { diff --git a/src/link/MachO/Symbol.zig b/src/link/MachO/Symbol.zig index 8cb198e7d7..72cd55bf5a 100644 --- a/src/link/MachO/Symbol.zig +++ b/src/link/MachO/Symbol.zig @@ -331,9 +331,14 @@ fn format2( if (symbol.getAtom(ctx.macho_file)) |atom| { try writer.print(" : atom({d})", .{atom.atom_index}); } - var buf: [2]u8 = .{'_'} ** 2; + var buf: [3]u8 = .{'_'} ** 3; if (symbol.flags.@"export") buf[0] = 'E'; if (symbol.flags.import) buf[1] = 'I'; + switch (symbol.visibility) { + .local => buf[2] = 'L', + .hidden => buf[2] = 'H', + .global => buf[2] = 'G', + } try writer.print(" : {s}", .{&buf}); if (symbol.flags.weak) try writer.writeAll(" : weak"); if (symbol.isSymbolStab(ctx.macho_file)) try writer.writeAll(" : stab"); @@ -402,6 +407,14 @@ pub const Visibility = enum { global, hidden, local, + + pub fn rank(vis: Visibility) u2 { + return switch (vis) { + .local => 2, + .hidden => 1, + .global => 0, + }; + } }; pub const Extra = struct { diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 544d778f39..661a88904e 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -267,7 +267,7 @@ pub fn mergeSymbolVisibility(self: *ZigObject, macho_file: *MachO) void { for (self.symbols.items, 0..) |sym, i| { const ref = self.getSymbolRef(@intCast(i), macho_file); const global = ref.getSymbol(macho_file) orelse continue; - if (global.visibility != .global) { + if (sym.visibility.rank() < global.visibility.rank()) { global.visibility = sym.visibility; } if (sym.flags.weak_ref) { |
