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 {
21702170 for (slice.items(.header)) |header| {
21712171 const segname = header.segName();
21722172 if (self.getSegmentByName(segname) == null) {
2173 const flags: u32 = if (mem.startsWith(u8, segname, "__DATA_CONST")) macho.SG_READ_ONLY else 0;
2174 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname), .flags = flags });
2173 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) });
21752174 }
21762175 }
21772176
......@@ -2247,6 +2246,12 @@ fn initSegments(self: *MachO) !void {
22472246 segment.nsects += 1;
22482247 seg_id.* = segment_id;
22492248 }
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 }
22502255}
22512256
22522257fn allocateSections(self: *MachO) !void {
......@@ -3727,7 +3732,6 @@ pub fn addSegment(self: *MachO, name: []const u8, opts: struct {
37273732 fileoff: u64 = 0,
37283733 filesize: u64 = 0,
37293734 prot: macho.vm_prot_t = macho.PROT.NONE,
3730 flags: u32 = 0,
37313735}) error{OutOfMemory}!u8 {
37323736 const gpa = self.base.comp.gpa;
37333737 const index = @as(u8, @intCast(self.segments.items.len));