| ... | @@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node | ... | @@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 588 | try self.initSegments(); | 588 | try self.initSegments(); |
| 589 | | 589 | |
| 590 | try self.allocateSections(); | 590 | try self.allocateSections(); |
| 591 | self.allocateSegments(); | | |
| 592 | self.allocateAtoms(); | 591 | self.allocateAtoms(); |
| 593 | self.allocateSyntheticSymbols(); | 592 | self.allocateSyntheticSymbols(); |
| 594 | try self.allocateLinkeditSegment(); | 593 | try self.allocateLinkeditSegment(); |
| ... | @@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void { | ... | @@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void { |
| 2275 | self.segments.items[index].vmaddr + self.segments.items[index].vmsize | 2274 | self.segments.items[index].vmaddr + self.segments.items[index].vmsize |
| 2276 | else | 2275 | else |
| 2277 | 0; | 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 | vmaddr += headerpad; | 2285 | vmaddr += headerpad; |
| 2279 | var fileoff = headerpad; | 2286 | var fileoff = headerpad; |
| 2280 | | 2287 | |
| 2281 | const page_size = self.getPageSize(); | 2288 | const page_size = self.getPageSize(); |
| 2282 | const slice = self.sections.slice(); | 2289 | const slice = self.sections.slice(); |
| 2283 | | 2290 | |
| 2284 | var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0; | 2291 | for (slice.items(.header), slice.items(.segment_id)) |*header, curr_seg_id| { |
| 2285 | for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| { | | |
| 2286 | defer next_seg_id = seg_id; | | |
| 2287 | | | |
| 2288 | if (mem.indexOf(u8, header.segName(), "ZIG")) |_| continue; | 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 | vmaddr = mem.alignForward(u64, vmaddr, page_size); | 2298 | vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| 2291 | fileoff = mem.alignForward(u32, fileoff, page_size); | 2299 | fileoff = mem.alignForward(u32, fileoff, page_size); |
| | 2300 | curr_seg.vmaddr = vmaddr; |
| | 2301 | curr_seg.fileoff = fileoff; |
| 2292 | } | 2302 | } |
| 2293 | | 2303 | |
| 2294 | const alignment = try math.powi(u32, 2, header.@"align"); | 2304 | const alignment = try math.powi(u32, 2, header.@"align"); |
| ... | @@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void { | ... | @@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void { |
| 2302 | header.offset = fileoff; | 2312 | header.offset = fileoff; |
| 2303 | fileoff += @intCast(header.size); | 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 | // TODO iterate over sections again, but consider only zig sections | 2325 | // TODO iterate over sections again, but consider only zig sections |
| ... | @@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void { | ... | @@ -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 | pub fn allocateAtoms(self: *MachO) void { | 2356 | pub fn allocateAtoms(self: *MachO) void { |
| 2384 | const slice = self.sections.slice(); | 2357 | const slice = self.sections.slice(); |
| 2385 | for (slice.items(.header), slice.items(.atoms)) |header, atoms| { | 2358 | for (slice.items(.header), slice.items(.atoms)) |header, atoms| { |