Commit a88ffa7fa9

Jakub Konka <kubkon@jakubkonka.com>
2023-03-21 11:38:19
macho+zld: save locals from section atoms to symtab too
1 parent 5b54666
Changed files (1)
src
link
MachO
src/link/MachO/zld.zig
@@ -2456,6 +2456,17 @@ pub const Zld = struct {
         try self.writeStrtab();
     }
 
+    fn addLocalToSymtab(self: *Zld, sym_loc: SymbolWithLoc, locals: *std.ArrayList(macho.nlist_64)) !void {
+        const sym = self.getSymbol(sym_loc);
+        if (sym.n_strx == 0) return; // no name, skip
+        if (sym.ext()) return; // an export lands in its own symtab section, skip
+        if (self.symbolIsTemp(sym_loc)) return; // local temp symbol, skip
+
+        var out_sym = sym;
+        out_sym.n_strx = try self.strtab.insert(self.gpa, self.getSymbolName(sym_loc));
+        try locals.append(out_sym);
+    }
+
     fn writeSymtab(self: *Zld) !SymtabCtx {
         const gpa = self.gpa;
 
@@ -2466,14 +2477,12 @@ pub const Zld = struct {
             for (object.atoms.items) |atom_index| {
                 const atom = self.getAtom(atom_index);
                 const sym_loc = atom.getSymbolWithLoc();
-                const sym = self.getSymbol(sym_loc);
-                if (sym.n_strx == 0) continue; // no name, skip
-                if (sym.ext()) continue; // an export lands in its own symtab section, skip
-                if (self.symbolIsTemp(sym_loc)) continue; // local temp symbol, skip
-
-                var out_sym = sym;
-                out_sym.n_strx = try self.strtab.insert(gpa, self.getSymbolName(sym_loc));
-                try locals.append(out_sym);
+                try self.addLocalToSymtab(sym_loc, &locals);
+
+                var it = Atom.getInnerSymbolsIterator(self, atom_index);
+                while (it.next()) |inner_sym_loc| {
+                    try self.addLocalToSymtab(inner_sym_loc, &locals);
+                }
             }
         }