| ... | ... | @@ -591,8 +591,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 591 | 591 | self.allocateSegments(); |
| 592 | 592 | self.allocateAtoms(); |
| 593 | 593 | self.allocateSyntheticSymbols(); |
| 594 | | |
| 595 | | try self.initLinkeditSegment(); |
| 594 | try self.allocateLinkeditSegment(); |
| 596 | 595 | |
| 597 | 596 | state_log.debug("{}", .{self.dumpState()}); |
| 598 | 597 | |
| ... | ... | @@ -2180,6 +2179,18 @@ fn initSegments(self: *MachO) !void { |
| 2180 | 2179 | }); |
| 2181 | 2180 | } |
| 2182 | 2181 | |
| 2182 | // Add __LINKEDIT |
| 2183 | { |
| 2184 | const protection = getSegmentProt("__LINKEDIT"); |
| 2185 | self.linkedit_seg_index = @intCast(self.segments.items.len); |
| 2186 | try self.segments.append(gpa, .{ |
| 2187 | .cmdsize = @sizeOf(macho.segment_command_64), |
| 2188 | .segname = makeStaticString("__LINKEDIT"), |
| 2189 | .maxprot = protection, |
| 2190 | .initprot = protection, |
| 2191 | }); |
| 2192 | } |
| 2193 | |
| 2183 | 2194 | const sortFn = struct { |
| 2184 | 2195 | fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool { |
| 2185 | 2196 | _ = ctx; |
| ... | ... | @@ -2261,10 +2272,11 @@ fn allocateSegments(self: *MachO) void { |
| 2261 | 2272 | 0; |
| 2262 | 2273 | var fileoff: u64 = 0; |
| 2263 | 2274 | const index = if (self.pagezero_seg_index) |index| index + 1 else 0; |
| 2275 | const last_index = self.linkedit_seg_index.?; // TODO: please clean this up! |
| 2264 | 2276 | |
| 2265 | 2277 | const slice = self.sections.slice(); |
| 2266 | 2278 | var next_sect_id: u8 = 0; |
| 2267 | | for (self.segments.items[index..], index..) |*seg, seg_id| { |
| 2279 | for (self.segments.items[index..last_index], index..last_index) |*seg, seg_id| { |
| 2268 | 2280 | if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| { |
| 2269 | 2281 | vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size); |
| 2270 | 2282 | if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) { |
| ... | ... | @@ -2390,7 +2402,7 @@ fn allocateSyntheticSymbols(self: *MachO) void { |
| 2390 | 2402 | } |
| 2391 | 2403 | } |
| 2392 | 2404 | |
| 2393 | | fn initLinkeditSegment(self: *MachO) !void { |
| 2405 | fn allocateLinkeditSegment(self: *MachO) !void { |
| 2394 | 2406 | var fileoff: u64 = 0; |
| 2395 | 2407 | var vmaddr: u64 = 0; |
| 2396 | 2408 | |
| ... | ... | @@ -2400,11 +2412,9 @@ fn initLinkeditSegment(self: *MachO) !void { |
| 2400 | 2412 | } |
| 2401 | 2413 | |
| 2402 | 2414 | const page_size = self.getPageSize(); |
| 2403 | | self.linkedit_seg_index = try self.addSegment("__LINKEDIT", .{ |
| 2404 | | .vmaddr = mem.alignForward(u64, vmaddr, page_size), |
| 2405 | | .fileoff = mem.alignForward(u64, fileoff, page_size), |
| 2406 | | .prot = getSegmentProt("__LINKEDIT"), |
| 2407 | | }); |
| 2415 | const seg = self.getLinkeditSegment(); |
| 2416 | seg.vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| 2417 | seg.fileoff = mem.alignForward(u64, fileoff, page_size); |
| 2408 | 2418 | } |
| 2409 | 2419 | |
| 2410 | 2420 | fn initDyldInfoSections(self: *MachO) !void { |