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