Commit d7276c1527

Jakub Konka <kubkon@jakubkonka.com>
2024-02-24 18:47:37
macho: actually set SG_READ_ONLY on __DATA_CONST segment
1 parent aa39e98
Changed files (1)
src
src/link/MachO.zig
@@ -2170,8 +2170,7 @@ fn initSegments(self: *MachO) !void {
     for (slice.items(.header)) |header| {
         const segname = header.segName();
         if (self.getSegmentByName(segname) == null) {
-            const flags: u32 = if (mem.startsWith(u8, segname, "__DATA_CONST")) macho.SG_READ_ONLY else 0;
-            _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname), .flags = flags });
+            _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) });
         }
     }
 
@@ -2247,6 +2246,12 @@ fn initSegments(self: *MachO) !void {
         segment.nsects += 1;
         seg_id.* = segment_id;
     }
+
+    // Set __DATA_CONST as READ_ONLY
+    if (self.getSegmentByName("__DATA_CONST")) |seg_id| {
+        const seg = &self.segments.items[seg_id];
+        seg.flags |= macho.SG_READ_ONLY;
+    }
 }
 
 fn allocateSections(self: *MachO) !void {
@@ -3727,7 +3732,6 @@ pub fn addSegment(self: *MachO, name: []const u8, opts: struct {
     fileoff: u64 = 0,
     filesize: u64 = 0,
     prot: macho.vm_prot_t = macho.PROT.NONE,
-    flags: u32 = 0,
 }) error{OutOfMemory}!u8 {
     const gpa = self.base.comp.gpa;
     const index = @as(u8, @intCast(self.segments.items.len));