aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-03-05 17:01:41 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-03-05 17:55:01 +0100
commit2be003a3b37f32b2c187064b975fc10f335d5ac1 (patch)
treee42ca262502c7386c36fdef953490dea650dc646 /src
parent3318400ea33cfa5d8a5d547dc535d7e30207dea2 (diff)
downloadzig-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.zig34
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;