authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-21 11:38:19+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-21 11:38:19+01:00
loga88ffa7fa91e568fe234ac9ea2b15f005876cca6
tree88fd9084724abcb5434ff8e1a12912bda791a3c8
parent5b5466626810302371b2d21c39e7ad04ea13a8dc

macho+zld: save locals from section atoms to symtab too


1 files changed, 17 insertions(+), 8 deletions(-)

src/link/MachO/zld.zig+17-8
...@@ -2456,6 +2456,17 @@ pub const Zld = struct {...@@ -2456,6 +2456,17 @@ pub const Zld = struct {
2456 try self.writeStrtab();2456 try self.writeStrtab();
2457 }2457 }
24582458
2459 fn addLocalToSymtab(self: *Zld, sym_loc: SymbolWithLoc, locals: *std.ArrayList(macho.nlist_64)) !void {
2460 const sym = self.getSymbol(sym_loc);
2461 if (sym.n_strx == 0) return; // no name, skip
2462 if (sym.ext()) return; // an export lands in its own symtab section, skip
2463 if (self.symbolIsTemp(sym_loc)) return; // local temp symbol, skip
2464
2465 var out_sym = sym;
2466 out_sym.n_strx = try self.strtab.insert(self.gpa, self.getSymbolName(sym_loc));
2467 try locals.append(out_sym);
2468 }
2469
2459 fn writeSymtab(self: *Zld) !SymtabCtx {2470 fn writeSymtab(self: *Zld) !SymtabCtx {
2460 const gpa = self.gpa;2471 const gpa = self.gpa;
24612472
...@@ -2466,14 +2477,12 @@ pub const Zld = struct {...@@ -2466,14 +2477,12 @@ pub const Zld = struct {
2466 for (object.atoms.items) |atom_index| {2477 for (object.atoms.items) |atom_index| {
2467 const atom = self.getAtom(atom_index);2478 const atom = self.getAtom(atom_index);
2468 const sym_loc = atom.getSymbolWithLoc();2479 const sym_loc = atom.getSymbolWithLoc();
2469 const sym = self.getSymbol(sym_loc);2480 try self.addLocalToSymtab(sym_loc, &locals);
2470 if (sym.n_strx == 0) continue; // no name, skip2481
2471 if (sym.ext()) continue; // an export lands in its own symtab section, skip2482 var it = Atom.getInnerSymbolsIterator(self, atom_index);
2472 if (self.symbolIsTemp(sym_loc)) continue; // local temp symbol, skip2483 while (it.next()) |inner_sym_loc| {
24732484 try self.addLocalToSymtab(inner_sym_loc, &locals);
2474 var out_sym = sym;2485 }
2475 out_sym.n_strx = try self.strtab.insert(gpa, self.getSymbolName(sym_loc));
2476 try locals.append(out_sym);
2477 }2486 }
2478 }2487 }
24792488