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 {
15821582 /// (Darwin) Path to entitlements file
15831583 entitlements: ?[]const u8 = null,
15841584
1585 /// (Darwin) Size of the pagezero segment.
1586 pagezero_size: ?u64 = null,
1587
15851588 /// Position Independent Code
15861589 force_pic: ?bool = null,
15871590
......@@ -2638,6 +2641,10 @@ pub const LibExeObjStep = struct {
26382641 if (self.entitlements) |entitlements| {
26392642 try zig_args.appendSlice(&[_][]const u8{ "--entitlements", entitlements });
26402643 }
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
26422649 if (self.bundle_compiler_rt) |x| {
26432650 if (x) {
test/link.zig+4
......@@ -28,6 +28,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
2828 });
2929
3030 if (builtin.os.tag == .macos) {
31 cases.addBuildFile("test/link/pagezero/build.zig", .{
32 .build_modes = false,
33 });
34
3135 cases.addBuildFile("test/link/dylib/build.zig", .{
3236 .build_modes = true,
3337 });
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}