diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-12 13:18:52 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-07-18 09:13:08 +0200 |
| commit | 2579c55d4903b016e0fb6d1f52fbbfe4a2a71c26 (patch) | |
| tree | 517d7557e6b56ff98c6315643737d2a1adca404b /src/link | |
| parent | 4aff0ec394cb6ef42db982df86caf8976b558d43 (diff) | |
| download | zig-2579c55d4903b016e0fb6d1f52fbbfe4a2a71c26.tar.gz zig-2579c55d4903b016e0fb6d1f52fbbfe4a2a71c26.zip | |
macho: adjust global creation in ZigObject to new model
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 79e563ac1a..8e65feb264 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -167,6 +167,7 @@ pub fn createAtomForDecl(self: *ZigObject, allocator: Allocator, macho_file: *Ma relocs.* = .{}; const atom = self.getAtom(atom_index).?; atom.addExtra(.{ .rel_index = relocs_index, .rel_count = 0 }, macho_file); + try self.globals.append(allocator, 0); return symbol_index; } @@ -1315,22 +1316,30 @@ pub fn updateExports( break :blk global_nlist_index; }; const global_nlist = &self.symtab.items(.nlist)[global_nlist_index]; + const atom_index = self.symtab.items(.atom)[nlist_idx]; + const global_sym = &self.symbols.items[global_nlist_index]; global_nlist.n_value = nlist.n_value; global_nlist.n_sect = nlist.n_sect; global_nlist.n_type = macho.N_EXT | macho.N_SECT; self.symtab.items(.size)[global_nlist_index] = self.symtab.items(.size)[nlist_idx]; - self.symtab.items(.atom)[global_nlist_index] = self.symtab.items(.atom)[nlist_idx]; + self.symtab.items(.atom)[global_nlist_index] = atom_index; + global_sym.atom_ref = .{ .index = atom_index, .file = self.index }; switch (exp.opts.linkage) { .internal => { // Symbol should be hidden, or in MachO lingo, private extern. global_nlist.n_type |= macho.N_PEXT; + global_sym.visibility = .hidden; + }, + .strong => { + global_sym.visibility = .global; }, - .strong => {}, .weak => { // Weak linkage is specified as part of n_desc field. // Symbol's n_type is like for a symbol with strong linkage. global_nlist.n_desc |= macho.N_WEAK_DEF; + global_sym.visibility = .global; + global_sym.flags.weak = true; }, else => unreachable, } @@ -1460,16 +1469,17 @@ pub fn getGlobalSymbol(self: *ZigObject, macho_file: *MachO, name: []const u8, l const off = try self.strtab.insert(gpa, sym_name); const lookup_gop = try self.globals_lookup.getOrPut(gpa, off); if (!lookup_gop.found_existing) { + const sym_index = try self.addSymbol(gpa); + const sym = &self.symbols.items[sym_index]; const nlist_index = try self.addNlist(gpa); const nlist = &self.symtab.items(.nlist)[nlist_index]; nlist.n_strx = off; nlist.n_type = macho.N_EXT; + sym.name = off; + sym.nlist_idx = nlist_index; + sym.extra = try self.addSymbolExtra(gpa, .{}); lookup_gop.value_ptr.* = nlist_index; - _ = try macho_file.resolver.getOrPut(gpa, .{ - .index = nlist_index, - .file = self.index, - }, macho_file); - try self.globals.append(gpa, nlist_index); + try self.globals.append(gpa, 0); } return lookup_gop.value_ptr.*; } @@ -1692,7 +1702,7 @@ fn formatSymtab( try writer.writeAll(" symbols\n"); const self = ctx.self; const macho_file = ctx.macho_file; - for (self.symbols.items, 0) |sym, i| { + for (self.symbols.items, 0..) |sym, i| { const ref = self.getSymbolRef(@intCast(i), macho_file); if (ref.getFile(macho_file) == null) { // TODO any better way of handling this? |
