Commit 129fe8668c

Jakub Konka <kubkon@jakubkonka.com>
2024-07-13 07:56:28
macho: write non-incremental atoms in ZigObject
1 parent e5a6618
Changed files (2)
src
src/link/MachO/ZigObject.zig
@@ -508,9 +508,20 @@ pub fn writeAtomsRelocatable(self: *ZigObject, macho_file: *MachO) !void {
 // For example, TLS data gets written out via traditional route.
 // Is there any better way of handling this?
 pub fn writeAtoms(self: *ZigObject, macho_file: *MachO) !void {
-    const gpa = macho_file.base.comp.gpa;
-    _ = gpa;
-    _ = self;
+    const tracy = trace(@src());
+    defer tracy.end();
+
+    for (self.getAtoms()) |atom_index| {
+        const atom = self.getAtom(atom_index) orelse continue;
+        if (!atom.flags.alive) continue;
+        const sect = atom.getInputSection(macho_file);
+        if (sect.isZerofill()) continue;
+        if (macho_file.isZigSection(atom.out_n_sect)) continue;
+        const off = atom.value;
+        const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items;
+        try self.getAtomData(macho_file, atom.*, buffer[off..][0..atom.size]);
+        try atom.resolveRelocs(macho_file, buffer[off..][0..atom.size]);
+    }
 }
 
 pub fn calcSymtabSize(self: *ZigObject, macho_file: *MachO) void {
src/link/MachO.zig
@@ -2351,6 +2351,9 @@ fn writeSectionsAndUpdateLinkeditSizes(self: *MachO) !void {
     for (self.objects.items) |index| {
         try self.getFile(index).?.writeAtoms(self);
     }
+    if (self.getZigObject()) |zo| {
+        try zo.writeAtoms(self);
+    }
     if (self.getInternalObject()) |obj| {
         try obj.asFile().writeAtoms(self);
     }