diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-05 17:01:41 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-03-05 17:55:01 +0100 |
| commit | 2be003a3b37f32b2c187064b975fc10f335d5ac1 (patch) | |
| tree | e42ca262502c7386c36fdef953490dea650dc646 /src | |
| parent | 3318400ea33cfa5d8a5d547dc535d7e30207dea2 (diff) | |
| download | zig-2be003a3b37f32b2c187064b975fc10f335d5ac1.tar.gz zig-2be003a3b37f32b2c187064b975fc10f335d5ac1.zip | |
macho: write NOPs as padding for machine code section
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 2f55c69b3a..c1b9c44f1c 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -2178,6 +2178,34 @@ fn writeAllAtoms(self: *MachO) !void { } } +fn writePadding(self: *MachO, match: MatchingSection, size: usize, writer: anytype) !void { + const is_code = match.seg == self.text_segment_cmd_index.? and match.sect == self.text_section_index.?; + const min_alignment: u3 = if (!is_code) + 1 + else switch (self.base.options.target.cpu.arch) { + .aarch64 => @sizeOf(u32), + .x86_64 => @as(u3, 1), + else => unreachable, + }; + + const len = @divExact(size, min_alignment); + var i: usize = 0; + while (i < len) : (i += 1) { + if (!is_code) { + try writer.writeByte(0); + } else switch (self.base.options.target.cpu.arch) { + .aarch64 => { + const inst = aarch64.Instruction.nop(); + try writer.writeIntLittle(u32, inst.toU32()); + }, + .x86_64 => { + try writer.writeByte(0x90); + }, + else => unreachable, + } + } +} + fn writeAtoms(self: *MachO) !void { var buffer = std.ArrayList(u8).init(self.base.allocator); defer buffer.deinit(); @@ -2213,11 +2241,7 @@ fn writeAtoms(self: *MachO) !void { try atom.resolveRelocs(self); try buffer.appendSlice(atom.code.items); try buffer.ensureUnusedCapacity(padding_size); - - var i: usize = 0; - while (i < padding_size) : (i += 1) { - buffer.appendAssumeCapacity(0); - } + try self.writePadding(match, padding_size, buffer.writer()); if (file_offset == null) { file_offset = sect.offset + atom_sym.n_value - sect.addr; |
