diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 0ee0879290..746fe07e0e 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -141,6 +141,9 @@ objc_selrefs_section_index: ?u16 = null, objc_classrefs_section_index: ?u16 = null, objc_data_section_index: ?u16 = null, +rustc_section_index: ?u16 = null, +rustc_section_size: u64 = 0, + bss_file_offset: u32 = 0, tlv_bss_file_offset: u32 = 0, @@ -993,6 +996,11 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { try self.writeAtoms(); } + if (self.rustc_section_index) |id| { + const seg = &self.load_commands.items[self.data_segment_cmd_index.?].segment; + const sect = &seg.sections.items[id]; + sect.size = self.rustc_section_size; + } if (self.bss_section_index) |idx| { const seg = &self.load_commands.items[self.data_segment_cmd_index.?].segment; const sect = &seg.sections.items[idx]; @@ -1886,6 +1894,24 @@ pub fn getMatchingSection(self: *MachO, sect: macho.section_64) !?MatchingSectio .seg = self.data_segment_cmd_index.?, .sect = self.objc_data_section_index.?, }; + } else if (mem.eql(u8, sectname, ".rustc")) { + if (self.rustc_section_index == null) { + self.rustc_section_index = try self.initSection( + self.data_segment_cmd_index.?, + ".rustc", + sect.size, + sect.@"align", + .{}, + ); + // We need to preserve the section size for rustc to properly + // decompress the metadata. + self.rustc_section_size = sect.size; + } + + break :blk .{ + .seg = self.data_segment_cmd_index.?, + .sect = self.rustc_section_index.?, + }; } else { if (self.data_section_index == null) { self.data_section_index = try self.initSection( @@ -5212,6 +5238,7 @@ fn sortSections(self: *MachO) !void { // __DATA segment const indices = &[_]*?u16{ + &self.rustc_section_index, &self.la_symbol_ptr_section_index, &self.objc_const_section_index, &self.objc_selrefs_section_index, diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index 12ca463760..70cdda6c2f 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -409,7 +409,7 @@ pub fn parseIntoAtoms(self: *Object, allocator: Allocator, macho_file: *MachO) ! } else blk: { var iundefsym: usize = sorted_all_nlists.items.len; while (iundefsym > 0) : (iundefsym -= 1) { - const nlist = sorted_all_nlists.items[iundefsym]; + const nlist = sorted_all_nlists.items[iundefsym - 1]; if (nlist.nlist.sect()) break; } break :blk iundefsym;