diff --git a/src/link/MachO/Archive.zig b/src/link/MachO/Archive.zig index 54c00e33eef74c485876e44382b25b3bf2eff262..a733e1a5b6c9b3911e27e5e60e1ae4e6faed54a5 100644 --- a/src/link/MachO/Archive.zig +++ b/src/link/MachO/Archive.zig @@ -89,12 +89,13 @@ pub fn unpack(self: *Archive, macho_file: *MachO, path: Path, handle_index: File pub fn writeHeader( object_name: []const u8, object_size: usize, - format: Format, writer: *Writer, ) !void { var hdr: ar_hdr = .{}; - const object_name_len = mem.alignForward(usize, object_name.len + 1, ptrWidth(format)); + const object_name_start = writer.end + @sizeOf(ar_hdr); + const object_start = mem.alignForward(usize, object_name_start + object_name.len + 1, 8); + const object_name_len = object_start - object_name_start; const total_object_size = object_size + object_name_len; { @@ -193,7 +194,7 @@ pub const ArSymtab = struct { pub fn write(ar: ArSymtab, format: Format, macho_file: *MachO, writer: *Writer) !void { const ptr_width = ptrWidth(format); // Header - try writeHeader(SYMDEF, ar.size(format), format, writer); + try writeHeader(SYMDEF, ar.size(format), writer); // Symtab size try writeInt(format, ar.entries.items.len * 2 * ptr_width, writer); // Symtab entries diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index cff42a447e090ed2e88c763a49023762f9dd1275..17b7e5e768f22ebebc22c0fecaab13eba95f59b7 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -1805,11 +1805,11 @@ pub fn updateArSize(self: *Object, macho_file: *MachO) !void { }; } -pub fn writeAr(self: Object, ar_format: Archive.Format, macho_file: *MachO, writer: *Writer) !void { +pub fn writeAr(self: Object, macho_file: *MachO, writer: *Writer) !void { // Header const size = try macho_file.cast(usize, self.output_ar_state.size); const basename = std.fs.path.basename(self.path); - try Archive.writeHeader(basename, size, ar_format, writer); + try Archive.writeHeader(basename, size, writer); // Data const file = macho_file.getFileHandle(self.file_handle); // TODO try using copyRangeAll diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index fc2500867f7d90d619c91fd0b2ad48bc3c59f9d1..6b69c2df05e692704acc961ac8b55a55c10fe7aa 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -322,10 +322,10 @@ pub fn updateArSize(self: *ZigObject) void { self.output_ar_state.size = self.data.items.len; } -pub fn writeAr(self: ZigObject, ar_format: Archive.Format, writer: anytype) !void { +pub fn writeAr(self: ZigObject, writer: anytype) !void { // Header const size = std.math.cast(usize, self.output_ar_state.size) orelse return error.Overflow; - try Archive.writeHeader(self.basename, size, ar_format, writer); + try Archive.writeHeader(self.basename, size, writer); // Data try writer.writeAll(self.data.items); } diff --git a/src/link/MachO/file.zig b/src/link/MachO/file.zig index 4f6f70debeef007b915bfeb07d5317b87fffabc2..ddd308ee2092e6e20c291468cf6373924bd85731 100644 --- a/src/link/MachO/file.zig +++ b/src/link/MachO/file.zig @@ -322,11 +322,11 @@ pub const File = union(enum) { }; } - pub fn writeAr(file: File, ar_format: Archive.Format, macho_file: *MachO, writer: anytype) !void { + pub fn writeAr(file: File, macho_file: *MachO, writer: anytype) !void { return switch (file) { .dylib, .internal => unreachable, - .zig_object => |x| x.writeAr(ar_format, writer), - .object => |x| x.writeAr(ar_format, macho_file, writer), + .zig_object => |x| x.writeAr(writer), + .object => |x| x.writeAr(macho_file, writer), }; } diff --git a/src/link/MachO/relocatable.zig b/src/link/MachO/relocatable.zig index b864ee66ca42394529dd6c58556e5cb10801e413..793cfe5f0c2659a7df45a6ea69dfccc0f101db08 100644 --- a/src/link/MachO/relocatable.zig +++ b/src/link/MachO/relocatable.zig @@ -149,7 +149,6 @@ pub fn flushStaticLib(macho_file: *MachO, comp: *Compilation, module_obj_path: ? for (macho_file.objects.items) |index| files.appendAssumeCapacity(index); const format: Archive.Format = .p32; - const ptr_width = Archive.ptrWidth(format); // Update ar symtab from parsed objects var ar_symtab: Archive.ArSymtab = .{}; @@ -171,7 +170,8 @@ pub fn flushStaticLib(macho_file: *MachO, comp: *Compilation, module_obj_path: ? const total_size: usize = blk: { var pos: usize = Archive.SARMAG; pos += @sizeOf(Archive.ar_hdr); - pos += mem.alignForward(usize, Archive.SYMDEF.len + 1, ptr_width); + pos += Archive.SYMDEF.len + 1; + pos = mem.alignForward(usize, pos, 8); pos += ar_symtab.size(format); for (files.items) |index| { @@ -182,7 +182,8 @@ pub fn flushStaticLib(macho_file: *MachO, comp: *Compilation, module_obj_path: ? pos = mem.alignForward(usize, pos, 2); state.file_off = pos; pos += @sizeOf(Archive.ar_hdr); - pos += mem.alignForward(usize, zo.basename.len + 1, ptr_width); + pos += zo.basename.len + 1; + pos = mem.alignForward(usize, pos, 8); pos += try macho_file.cast(usize, state.size); }, .object => |o| { @@ -190,7 +191,8 @@ pub fn flushStaticLib(macho_file: *MachO, comp: *Compilation, module_obj_path: ? pos = mem.alignForward(usize, pos, 2); state.file_off = pos; pos += @sizeOf(Archive.ar_hdr); - pos += mem.alignForward(usize, std.fs.path.basename(o.path).len + 1, ptr_width); + pos += std.fs.path.basename(o.path).len + 1; + pos = mem.alignForward(usize, pos, 8); pos += try macho_file.cast(usize, state.size); }, else => unreachable, @@ -222,7 +224,7 @@ pub fn flushStaticLib(macho_file: *MachO, comp: *Compilation, module_obj_path: ? if (padding > 0) { writer.splatByteAll(0, padding) catch unreachable; } - macho_file.getFile(index).?.writeAr(format, macho_file, &writer) catch |err| + macho_file.getFile(index).?.writeAr(macho_file, &writer) catch |err| return diags.fail("failed to write archive: {t}", .{err}); }