From 2d09540a636ab6ef2ca5087f18d55bbc259cd652 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Mon, 20 Jun 2022 18:25:20 +0200 Subject: [PATCH] link-tests: test pagezero_size option for macho --- lib/std/build.zig | 7 +++++++ test/link.zig | 4 ++++ test/link/pagezero/build.zig | 34 ++++++++++++++++++++++++++++++++++ test/link/pagezero/main.c | 3 +++ 4 files changed, 48 insertions(+) create mode 100644 test/link/pagezero/build.zig create mode 100644 test/link/pagezero/main.c diff --git a/lib/std/build.zig b/lib/std/build.zig index ce527ff021..af135ea02a 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -1582,6 +1582,9 @@ pub const LibExeObjStep = struct { /// (Darwin) Path to entitlements file entitlements: ?[]const u8 = null, + /// (Darwin) Size of the pagezero segment. + pagezero_size: ?u64 = null, + /// Position Independent Code force_pic: ?bool = null, @@ -2638,6 +2641,10 @@ pub const LibExeObjStep = struct { if (self.entitlements) |entitlements| { try zig_args.appendSlice(&[_][]const u8{ "--entitlements", entitlements }); } + if (self.pagezero_size) |pagezero_size| { + const size = try std.fmt.allocPrint(builder.allocator, "{x}", .{pagezero_size}); + try zig_args.appendSlice(&[_][]const u8{ "-pagezero_size", size }); + } if (self.bundle_compiler_rt) |x| { if (x) { diff --git a/test/link.zig b/test/link.zig index 9026da65ea..bc69003e68 100644 --- a/test/link.zig +++ b/test/link.zig @@ -28,6 +28,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void { }); if (builtin.os.tag == .macos) { + cases.addBuildFile("test/link/pagezero/build.zig", .{ + .build_modes = false, + }); + cases.addBuildFile("test/link/dylib/build.zig", .{ .build_modes = true, }); diff --git a/test/link/pagezero/build.zig b/test/link/pagezero/build.zig new file mode 100644 index 0000000000..65129008a4 --- /dev/null +++ b/test/link/pagezero/build.zig @@ -0,0 +1,34 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + + const exe = b.addExecutable("main", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkLibC(); + exe.pagezero_size = 0x4000; + + var name: [16]u8 = undefined; + std.mem.set(u8, &name, 0); + std.mem.copy(u8, &name, "__PAGEZERO"); + const pagezero_seg = std.macho.segment_command_64{ + .cmdsize = @sizeOf(std.macho.segment_command_64), + .segname = name, + .vmaddr = 0, + .vmsize = 0x4000, + .fileoff = 0, + .filesize = 0, + .maxprot = 0, + .initprot = 0, + .nsects = 0, + .flags = 0, + }; + const check_file = std.build.CheckFileStep.create(b, exe.getOutputSource(), &[_][]const u8{std.mem.asBytes(&pagezero_seg)}); + + test_step.dependOn(b.getInstallStep()); + test_step.dependOn(&check_file.step); +} diff --git a/test/link/pagezero/main.c b/test/link/pagezero/main.c new file mode 100644 index 0000000000..ca68d24cc7 --- /dev/null +++ b/test/link/pagezero/main.c @@ -0,0 +1,3 @@ +int main(int argc, char* argv[]) { + return 0; +}