authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-24 18:47:37+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-26 02:22:36+01:00
logd7276c1527a298ba8647f312d5e86615bbc99eda
tree82d4e668ebab577772191d6c55e1e46522b45f05
parentaa39e98d9024ab68246ae45b2d67c7eda46f28ab

macho: actually set SG_READ_ONLY on __DATA_CONST segment


1 files changed, 7 insertions(+), 3 deletions(-)

src/link/MachO.zig+7-3
...@@ -2170,8 +2170,7 @@ fn initSegments(self: *MachO) !void {...@@ -2170,8 +2170,7 @@ fn initSegments(self: *MachO) !void {
2170 for (slice.items(.header)) |header| {2170 for (slice.items(.header)) |header| {
2171 const segname = header.segName();2171 const segname = header.segName();
2172 if (self.getSegmentByName(segname) == null) {2172 if (self.getSegmentByName(segname) == null) {
2173 const flags: u32 = if (mem.startsWith(u8, segname, "__DATA_CONST")) macho.SG_READ_ONLY else 0;2173 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) });
2174 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname), .flags = flags });
2175 }2174 }
2176 }2175 }
21772176
...@@ -2247,6 +2246,12 @@ fn initSegments(self: *MachO) !void {...@@ -2247,6 +2246,12 @@ fn initSegments(self: *MachO) !void {
2247 segment.nsects += 1;2246 segment.nsects += 1;
2248 seg_id.* = segment_id;2247 seg_id.* = segment_id;
2249 }2248 }
2249
2250 // Set __DATA_CONST as READ_ONLY
2251 if (self.getSegmentByName("__DATA_CONST")) |seg_id| {
2252 const seg = &self.segments.items[seg_id];
2253 seg.flags |= macho.SG_READ_ONLY;
2254 }
2250}2255}
22512256
2252fn allocateSections(self: *MachO) !void {2257fn allocateSections(self: *MachO) !void {
...@@ -3727,7 +3732,6 @@ pub fn addSegment(self: *MachO, name: []const u8, opts: struct {...@@ -3727,7 +3732,6 @@ pub fn addSegment(self: *MachO, name: []const u8, opts: struct {
3727 fileoff: u64 = 0,3732 fileoff: u64 = 0,
3728 filesize: u64 = 0,3733 filesize: u64 = 0,
3729 prot: macho.vm_prot_t = macho.PROT.NONE,3734 prot: macho.vm_prot_t = macho.PROT.NONE,
3730 flags: u32 = 0,
3731}) error{OutOfMemory}!u8 {3735}) error{OutOfMemory}!u8 {
3732 const gpa = self.base.comp.gpa;3736 const gpa = self.base.comp.gpa;
3733 const index = @as(u8, @intCast(self.segments.items.len));3737 const index = @as(u8, @intCast(self.segments.items.len));