| ... | @@ -2203,20 +2203,6 @@ fn initSegments(self: *MachO) !void { | ... | @@ -2203,20 +2203,6 @@ fn initSegments(self: *MachO) !void { |
| 2203 | const gpa = self.base.comp.gpa; | 2203 | const gpa = self.base.comp.gpa; |
| 2204 | const slice = self.sections.slice(); | 2204 | const slice = self.sections.slice(); |
| 2205 | | 2205 | |
| 2206 | // First, create segments required by sections | | |
| 2207 | for (slice.items(.header)) |header| { | | |
| 2208 | const segname = header.segName(); | | |
| 2209 | if (self.getSegmentByName(segname) == null) { | | |
| 2210 | const prot = getSegmentProt(segname); | | |
| 2211 | try self.segments.append(gpa, .{ | | |
| 2212 | .cmdsize = @sizeOf(macho.segment_command_64), | | |
| 2213 | .segname = makeStaticString(segname), | | |
| 2214 | .maxprot = prot, | | |
| 2215 | .initprot = prot, | | |
| 2216 | }); | | |
| 2217 | } | | |
| 2218 | } | | |
| 2219 | | | |
| 2220 | // Add __PAGEZERO if required | 2206 | // Add __PAGEZERO if required |
| 2221 | const pagezero_size = self.pagezero_size orelse default_pagezero_size; | 2207 | const pagezero_size = self.pagezero_size orelse default_pagezero_size; |
| 2222 | const aligned_pagezero_size = mem.alignBackward(u64, pagezero_size, self.getPageSize()); | 2208 | const aligned_pagezero_size = mem.alignBackward(u64, pagezero_size, self.getPageSize()); |
| ... | @@ -2226,44 +2212,30 @@ fn initSegments(self: *MachO) !void { | ... | @@ -2226,44 +2212,30 @@ fn initSegments(self: *MachO) !void { |
| 2226 | log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_size}); | 2212 | log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_size}); |
| 2227 | log.warn(" rounding down to 0x{x}", .{aligned_pagezero_size}); | 2213 | log.warn(" rounding down to 0x{x}", .{aligned_pagezero_size}); |
| 2228 | } | 2214 | } |
| 2229 | try self.segments.append(gpa, .{ | 2215 | _ = try self.addSegment("__PAGEZERO", .{ .vmsize = aligned_pagezero_size }); |
| 2230 | .cmdsize = @sizeOf(macho.segment_command_64), | | |
| 2231 | .segname = makeStaticString("__PAGEZERO"), | | |
| 2232 | .vmsize = aligned_pagezero_size, | | |
| 2233 | }); | | |
| 2234 | } | 2216 | } |
| 2235 | | 2217 | |
| 2236 | // __TEXT segment is non-optional | 2218 | // __TEXT segment is non-optional |
| 2237 | if (self.getSegmentByName("__TEXT") == null) { | 2219 | _ = try self.addSegment("__TEXT", .{ .prot = getSegmentProt("__TEXT") }); |
| 2238 | const protection = getSegmentProt("__TEXT"); | 2220 | |
| 2239 | try self.segments.append(gpa, .{ | 2221 | // Next, create segments required by sections |
| 2240 | .cmdsize = @sizeOf(macho.segment_command_64), | 2222 | for (slice.items(.header)) |header| { |
| 2241 | .segname = makeStaticString("__TEXT"), | 2223 | const segname = header.segName(); |
| 2242 | .maxprot = protection, | 2224 | if (self.getSegmentByName(segname) == null) { |
| 2243 | .initprot = protection, | 2225 | _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) }); |
| 2244 | }); | 2226 | } |
| 2245 | } | 2227 | } |
| 2246 | | 2228 | |
| 2247 | // Add __LINKEDIT | 2229 | // Add __LINKEDIT |
| 2248 | { | 2230 | _ = try self.addSegment("__LINKEDIT", .{ .prot = getSegmentProt("__LINKEDIT") }); |
| 2249 | const protection = getSegmentProt("__LINKEDIT"); | | |
| 2250 | self.linkedit_seg_index = @intCast(self.segments.items.len); | | |
| 2251 | try self.segments.append(gpa, .{ | | |
| 2252 | .cmdsize = @sizeOf(macho.segment_command_64), | | |
| 2253 | .segname = makeStaticString("__LINKEDIT"), | | |
| 2254 | .maxprot = protection, | | |
| 2255 | .initprot = protection, | | |
| 2256 | }); | | |
| 2257 | } | | |
| 2258 | | 2231 | |
| | 2232 | // Sort segments |
| 2259 | const sortFn = struct { | 2233 | const sortFn = struct { |
| 2260 | fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool { | 2234 | fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool { |
| 2261 | _ = ctx; | 2235 | _ = ctx; |
| 2262 | return getSegmentRank(lhs.segName()) < getSegmentRank(rhs.segName()); | 2236 | return getSegmentRank(lhs.segName()) < getSegmentRank(rhs.segName()); |
| 2263 | } | 2237 | } |
| 2264 | }.sortFn; | 2238 | }.sortFn; |
| 2265 | | | |
| 2266 | // Sort segments | | |
| 2267 | mem.sort(macho.segment_command_64, self.segments.items, {}, sortFn); | 2239 | mem.sort(macho.segment_command_64, self.segments.items, {}, sortFn); |
| 2268 | | 2240 | |
| 2269 | // Attach sections to segments | 2241 | // Attach sections to segments |
| ... | @@ -2288,6 +2260,12 @@ fn initSegments(self: *MachO) !void { | ... | @@ -2288,6 +2260,12 @@ fn initSegments(self: *MachO) !void { |
| 2288 | | 2260 | |
| 2289 | self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO"); | 2261 | self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO"); |
| 2290 | self.text_seg_index = self.getSegmentByName("__TEXT").?; | 2262 | self.text_seg_index = self.getSegmentByName("__TEXT").?; |
| | 2263 | self.linkedit_seg_index = self.getSegmentByName("__LINKEDIT").?; |
| | 2264 | self.zig_text_seg_index = self.getSegmentByName("__TEXT_ZIG"); |
| | 2265 | self.zig_got_seg_index = self.getSegmentByName("__GOT_ZIG"); |
| | 2266 | self.zig_const_seg_index = self.getSegmentByName("__CONST_ZIG"); |
| | 2267 | self.zig_data_seg_index = self.getSegmentByName("__DATA_ZIG"); |
| | 2268 | self.zig_bss_seg_index = self.getSegmentByName("__BSS_ZIG"); |
| 2291 | } | 2269 | } |
| 2292 | | 2270 | |
| 2293 | fn allocateSections(self: *MachO) !void { | 2271 | fn allocateSections(self: *MachO) !void { |