| ... | @@ -2178,6 +2178,34 @@ fn writeAllAtoms(self: *MachO) !void { | ... | @@ -2178,6 +2178,34 @@ fn writeAllAtoms(self: *MachO) !void { |
| 2178 | } | 2178 | } |
| 2179 | } | 2179 | } |
| 2180 | | 2180 | |
| | 2181 | fn writePadding(self: *MachO, match: MatchingSection, size: usize, writer: anytype) !void { |
| | 2182 | const is_code = match.seg == self.text_segment_cmd_index.? and match.sect == self.text_section_index.?; |
| | 2183 | const min_alignment: u3 = if (!is_code) |
| | 2184 | 1 |
| | 2185 | else switch (self.base.options.target.cpu.arch) { |
| | 2186 | .aarch64 => @sizeOf(u32), |
| | 2187 | .x86_64 => @as(u3, 1), |
| | 2188 | else => unreachable, |
| | 2189 | }; |
| | 2190 | |
| | 2191 | const len = @divExact(size, min_alignment); |
| | 2192 | var i: usize = 0; |
| | 2193 | while (i < len) : (i += 1) { |
| | 2194 | if (!is_code) { |
| | 2195 | try writer.writeByte(0); |
| | 2196 | } else switch (self.base.options.target.cpu.arch) { |
| | 2197 | .aarch64 => { |
| | 2198 | const inst = aarch64.Instruction.nop(); |
| | 2199 | try writer.writeIntLittle(u32, inst.toU32()); |
| | 2200 | }, |
| | 2201 | .x86_64 => { |
| | 2202 | try writer.writeByte(0x90); |
| | 2203 | }, |
| | 2204 | else => unreachable, |
| | 2205 | } |
| | 2206 | } |
| | 2207 | } |
| | 2208 | |
| 2181 | fn writeAtoms(self: *MachO) !void { | 2209 | fn writeAtoms(self: *MachO) !void { |
| 2182 | var buffer = std.ArrayList(u8).init(self.base.allocator); | 2210 | var buffer = std.ArrayList(u8).init(self.base.allocator); |
| 2183 | defer buffer.deinit(); | 2211 | defer buffer.deinit(); |
| ... | @@ -2213,11 +2241,7 @@ fn writeAtoms(self: *MachO) !void { | ... | @@ -2213,11 +2241,7 @@ fn writeAtoms(self: *MachO) !void { |
| 2213 | try atom.resolveRelocs(self); | 2241 | try atom.resolveRelocs(self); |
| 2214 | try buffer.appendSlice(atom.code.items); | 2242 | try buffer.appendSlice(atom.code.items); |
| 2215 | try buffer.ensureUnusedCapacity(padding_size); | 2243 | try buffer.ensureUnusedCapacity(padding_size); |
| 2216 | | 2244 | try self.writePadding(match, padding_size, buffer.writer()); |
| 2217 | var i: usize = 0; | | |
| 2218 | while (i < padding_size) : (i += 1) { | | |
| 2219 | buffer.appendAssumeCapacity(0); | | |
| 2220 | } | | |
| 2221 | | 2245 | |
| 2222 | if (file_offset == null) { | 2246 | if (file_offset == null) { |
| 2223 | file_offset = sect.offset + atom_sym.n_value - sect.addr; | 2247 | file_offset = sect.offset + atom_sym.n_value - sect.addr; |