| ... | ... | @@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 588 | 588 | try self.initSegments(); |
| 589 | 589 | |
| 590 | 590 | try self.allocateSections(); |
| 591 | | self.allocateSegments(); |
| 592 | 591 | self.allocateAtoms(); |
| 593 | 592 | self.allocateSyntheticSymbols(); |
| 594 | 593 | try self.allocateLinkeditSegment(); |
| ... | ... | @@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void { |
| 2275 | 2274 | self.segments.items[index].vmaddr + self.segments.items[index].vmsize |
| 2276 | 2275 | else |
| 2277 | 2276 | 0; |
| 2277 | |
| 2278 | var prev_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0; |
| 2279 | { |
| 2280 | const seg = &self.segments.items[prev_seg_id]; |
| 2281 | seg.vmaddr = vmaddr; |
| 2282 | seg.fileoff = 0; |
| 2283 | } |
| 2284 | |
| 2278 | 2285 | vmaddr += headerpad; |
| 2279 | 2286 | var fileoff = headerpad; |
| 2280 | 2287 | |
| 2281 | 2288 | const page_size = self.getPageSize(); |
| 2282 | 2289 | const slice = self.sections.slice(); |
| 2283 | 2290 | |
| 2284 | | var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0; |
| 2285 | | for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| { |
| 2286 | | defer next_seg_id = seg_id; |
| 2287 | | |
| 2291 | for (slice.items(.header), slice.items(.segment_id)) |*header, curr_seg_id| { |
| 2288 | 2292 | if (mem.indexOf(u8, header.segName(), "ZIG")) |_| continue; |
| 2289 | | if (seg_id != next_seg_id) { |
| 2293 | if (prev_seg_id != curr_seg_id) { |
| 2294 | const prev_seg = &self.segments.items[prev_seg_id]; |
| 2295 | const curr_seg = &self.segments.items[curr_seg_id]; |
| 2296 | prev_seg.vmsize = vmaddr - prev_seg.vmaddr; |
| 2297 | prev_seg.filesize = fileoff - prev_seg.fileoff; |
| 2290 | 2298 | vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| 2291 | 2299 | fileoff = mem.alignForward(u32, fileoff, page_size); |
| 2300 | curr_seg.vmaddr = vmaddr; |
| 2301 | curr_seg.fileoff = fileoff; |
| 2292 | 2302 | } |
| 2293 | 2303 | |
| 2294 | 2304 | const alignment = try math.powi(u32, 2, header.@"align"); |
| ... | ... | @@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void { |
| 2302 | 2312 | header.offset = fileoff; |
| 2303 | 2313 | fileoff += @intCast(header.size); |
| 2304 | 2314 | } |
| 2315 | |
| 2316 | prev_seg_id = curr_seg_id; |
| 2317 | } |
| 2318 | |
| 2319 | { |
| 2320 | const prev_seg = &self.segments.items[prev_seg_id]; |
| 2321 | prev_seg.vmsize = vmaddr - prev_seg.vmaddr; |
| 2322 | prev_seg.filesize = fileoff - prev_seg.fileoff; |
| 2305 | 2323 | } |
| 2306 | 2324 | |
| 2307 | 2325 | // TODO iterate over sections again, but consider only zig sections |
| ... | ... | @@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void { |
| 2335 | 2353 | } |
| 2336 | 2354 | } |
| 2337 | 2355 | |
| 2338 | | fn allocateSegments(self: *MachO) void { |
| 2339 | | const page_size = self.getPageSize(); |
| 2340 | | var vmaddr = if (self.pagezero_seg_index) |index| |
| 2341 | | self.segments.items[index].vmaddr + self.segments.items[index].vmsize |
| 2342 | | else |
| 2343 | | 0; |
| 2344 | | var fileoff: u64 = 0; |
| 2345 | | const index = if (self.pagezero_seg_index) |index| index + 1 else 0; |
| 2346 | | const last_index = self.linkedit_seg_index.?; // TODO: please clean this up! |
| 2347 | | |
| 2348 | | const slice = self.sections.slice(); |
| 2349 | | var next_sect_id: u8 = 0; |
| 2350 | | for (self.segments.items[index..last_index], index..last_index) |*seg, seg_id| { |
| 2351 | | if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| { |
| 2352 | | vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size); |
| 2353 | | if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) { |
| 2354 | | fileoff = mem.alignForward(u64, seg.fileoff + seg.filesize, page_size); |
| 2355 | | } |
| 2356 | | } else { |
| 2357 | | seg.vmaddr = vmaddr; |
| 2358 | | seg.fileoff = fileoff; |
| 2359 | | |
| 2360 | | for ( |
| 2361 | | slice.items(.header)[next_sect_id..], |
| 2362 | | slice.items(.segment_id)[next_sect_id..], |
| 2363 | | ) |header, sid| { |
| 2364 | | if (seg_id != sid) break; |
| 2365 | | |
| 2366 | | vmaddr = header.addr + header.size; |
| 2367 | | if (!header.isZerofill()) { |
| 2368 | | fileoff = header.offset + header.size; |
| 2369 | | } |
| 2370 | | |
| 2371 | | next_sect_id += 1; |
| 2372 | | } |
| 2373 | | |
| 2374 | | vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| 2375 | | fileoff = mem.alignForward(u64, fileoff, page_size); |
| 2376 | | |
| 2377 | | seg.vmsize = vmaddr - seg.vmaddr; |
| 2378 | | seg.filesize = fileoff - seg.fileoff; |
| 2379 | | } |
| 2380 | | } |
| 2381 | | } |
| 2382 | | |
| 2383 | 2356 | pub fn allocateAtoms(self: *MachO) void { |
| 2384 | 2357 | const slice = self.sections.slice(); |
| 2385 | 2358 | for (slice.items(.header), slice.items(.atoms)) |header, atoms| { |