authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 17:01:41+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-05 17:55:01+01:00
log2be003a3b37f32b2c187064b975fc10f335d5ac1
treee42ca262502c7386c36fdef953490dea650dc646
parent3318400ea33cfa5d8a5d547dc535d7e30207dea2

macho: write NOPs as padding for machine code section


1 files changed, 29 insertions(+), 5 deletions(-)

src/link/MachO.zig+29-5
......@@ -2178,6 +2178,34 @@ fn writeAllAtoms(self: *MachO) !void {
21782178 }
21792179}
21802180
2181fn 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
21812209fn writeAtoms(self: *MachO) !void {
21822210 var buffer = std.ArrayList(u8).init(self.base.allocator);
21832211 defer buffer.deinit();
......@@ -2213,11 +2241,7 @@ fn writeAtoms(self: *MachO) !void {
22132241 try atom.resolveRelocs(self);
22142242 try buffer.appendSlice(atom.code.items);
22152243 try buffer.ensureUnusedCapacity(padding_size);
2216
2217 var i: usize = 0;
2218 while (i < padding_size) : (i += 1) {
2219 buffer.appendAssumeCapacity(0);
2220 }
2244 try self.writePadding(match, padding_size, buffer.writer());
22212245
22222246 if (file_offset == null) {
22232247 file_offset = sect.offset + atom_sym.n_value - sect.addr;