authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-20 18:25:20+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-20 18:25:20+02:00
log2d09540a636ab6ef2ca5087f18d55bbc259cd652
tree47dc569218ff7be2c28f2960a093d947643268dd
parent6e56a8df20395749b21b3857952dae1c227aacf1

link-tests: test pagezero_size option for macho


4 files changed, 48 insertions(+), 0 deletions(-)

lib/std/build.zig+7
...@@ -1582,6 +1582,9 @@ pub const LibExeObjStep = struct {...@@ -1582,6 +1582,9 @@ pub const LibExeObjStep = struct {
1582 /// (Darwin) Path to entitlements file1582 /// (Darwin) Path to entitlements file
1583 entitlements: ?[]const u8 = null,1583 entitlements: ?[]const u8 = null,
15841584
1585 /// (Darwin) Size of the pagezero segment.
1586 pagezero_size: ?u64 = null,
1587
1585 /// Position Independent Code1588 /// Position Independent Code
1586 force_pic: ?bool = null,1589 force_pic: ?bool = null,
15871590
...@@ -2638,6 +2641,10 @@ pub const LibExeObjStep = struct {...@@ -2638,6 +2641,10 @@ pub const LibExeObjStep = struct {
2638 if (self.entitlements) |entitlements| {2641 if (self.entitlements) |entitlements| {
2639 try zig_args.appendSlice(&[_][]const u8{ "--entitlements", entitlements });2642 try zig_args.appendSlice(&[_][]const u8{ "--entitlements", entitlements });
2640 }2643 }
2644 if (self.pagezero_size) |pagezero_size| {
2645 const size = try std.fmt.allocPrint(builder.allocator, "{x}", .{pagezero_size});
2646 try zig_args.appendSlice(&[_][]const u8{ "-pagezero_size", size });
2647 }
26412648
2642 if (self.bundle_compiler_rt) |x| {2649 if (self.bundle_compiler_rt) |x| {
2643 if (x) {2650 if (x) {
test/link.zig+4
...@@ -28,6 +28,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -28,6 +28,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
28 });28 });
2929
30 if (builtin.os.tag == .macos) {30 if (builtin.os.tag == .macos) {
31 cases.addBuildFile("test/link/pagezero/build.zig", .{
32 .build_modes = false,
33 });
34
31 cases.addBuildFile("test/link/dylib/build.zig", .{35 cases.addBuildFile("test/link/dylib/build.zig", .{
32 .build_modes = true,36 .build_modes = true,
33 });37 });
test/link/pagezero/build.zig created+34
...@@ -0,0 +1,34 @@
1const std = @import("std");
2const Builder = std.build.Builder;
3
4pub fn build(b: *Builder) void {
5 const mode = b.standardReleaseOptions();
6
7 const test_step = b.step("test", "Test");
8
9 const exe = b.addExecutable("main", null);
10 exe.setBuildMode(mode);
11 exe.addCSourceFile("main.c", &.{});
12 exe.linkLibC();
13 exe.pagezero_size = 0x4000;
14
15 var name: [16]u8 = undefined;
16 std.mem.set(u8, &name, 0);
17 std.mem.copy(u8, &name, "__PAGEZERO");
18 const pagezero_seg = std.macho.segment_command_64{
19 .cmdsize = @sizeOf(std.macho.segment_command_64),
20 .segname = name,
21 .vmaddr = 0,
22 .vmsize = 0x4000,
23 .fileoff = 0,
24 .filesize = 0,
25 .maxprot = 0,
26 .initprot = 0,
27 .nsects = 0,
28 .flags = 0,
29 };
30 const check_file = std.build.CheckFileStep.create(b, exe.getOutputSource(), &[_][]const u8{std.mem.asBytes(&pagezero_seg)});
31
32 test_step.dependOn(b.getInstallStep());
33 test_step.dependOn(&check_file.step);
34}
test/link/pagezero/main.c created+3
...@@ -0,0 +1,3 @@
1int main(int argc, char* argv[]) {
2 return 0;
3}