Commit 46bc91ade5

Jakub Konka <kubkon@jakubkonka.com>
2024-01-22 19:24:58
macho: skip -r when single input object file
This is to ensure we don't unnecessarily strip debug info from the final relocatable input file, so just copy the file out for now.
1 parent f2dce0c
Changed files (1)
src
link
src/link/MachO/relocatable.zig
@@ -12,6 +12,20 @@ pub fn flush(macho_file: *MachO, comp: *Compilation, module_obj_path: ?[]const u
 
     if (module_obj_path) |path| try positionals.append(.{ .path = path });
 
+    if (positionals.items.len == 1) {
+        // Instead of invoking a full-blown `-r` mode on the input which sadly will strip all
+        // debug info segments/sections (this is apparently by design by Apple), we copy
+        // the *only* input file over.
+        // TODO: in the future, when we implement `dsymutil` alternative directly in the Zig
+        // compiler, investigate if we can get rid of this `if` prong here.
+        const path = positionals.items[0].path;
+        const in_file = try std.fs.cwd().openFile(path, .{});
+        const stat = try in_file.stat();
+        const amt = try in_file.copyRangeAll(0, macho_file.base.file.?, 0, stat.size);
+        if (amt != stat.size) return error.InputOutput; // TODO: report an actual user error
+        return;
+    }
+
     for (positionals.items) |obj| {
         macho_file.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
             error.MalformedObject,