| ... | ... | @@ -592,6 +592,8 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 592 | 592 | self.allocateAtoms(); |
| 593 | 593 | self.allocateSyntheticSymbols(); |
| 594 | 594 | |
| 595 | try self.initLinkeditSegment(); |
| 596 | |
| 595 | 597 | state_log.debug("{}", .{self.dumpState()}); |
| 596 | 598 | |
| 597 | 599 | try self.initDyldInfoSections(); |
| ... | ... | @@ -2167,18 +2169,6 @@ fn initSegments(self: *MachO) !void { |
| 2167 | 2169 | }); |
| 2168 | 2170 | } |
| 2169 | 2171 | |
| 2170 | | // Add __LINKEDIT |
| 2171 | | { |
| 2172 | | const protection = getSegmentProt("__LINKEDIT"); |
| 2173 | | self.linkedit_seg_index = @intCast(self.segments.items.len); |
| 2174 | | try self.segments.append(gpa, .{ |
| 2175 | | .cmdsize = @sizeOf(macho.segment_command_64), |
| 2176 | | .segname = makeStaticString("__LINKEDIT"), |
| 2177 | | .maxprot = protection, |
| 2178 | | .initprot = protection, |
| 2179 | | }); |
| 2180 | | } |
| 2181 | | |
| 2182 | 2172 | // __TEXT segment is non-optional |
| 2183 | 2173 | if (self.getSegmentByName("__TEXT") == null) { |
| 2184 | 2174 | const protection = getSegmentProt("__TEXT"); |
| ... | ... | @@ -2222,7 +2212,6 @@ fn initSegments(self: *MachO) !void { |
| 2222 | 2212 | |
| 2223 | 2213 | self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO"); |
| 2224 | 2214 | self.text_seg_index = self.getSegmentByName("__TEXT").?; |
| 2225 | | self.linkedit_seg_index = self.getSegmentByName("__LINKEDIT").?; |
| 2226 | 2215 | } |
| 2227 | 2216 | |
| 2228 | 2217 | fn allocateSections(self: *MachO) !void { |
| ... | ... | @@ -2401,6 +2390,23 @@ fn allocateSyntheticSymbols(self: *MachO) void { |
| 2401 | 2390 | } |
| 2402 | 2391 | } |
| 2403 | 2392 | |
| 2393 | fn initLinkeditSegment(self: *MachO) !void { |
| 2394 | var fileoff: u64 = 0; |
| 2395 | var vmaddr: u64 = 0; |
| 2396 | |
| 2397 | for (self.segments.items) |seg| { |
| 2398 | if (fileoff < seg.fileoff + seg.filesize) fileoff = seg.fileoff + seg.filesize; |
| 2399 | if (vmaddr < seg.vmaddr + seg.vmsize) vmaddr = seg.vmaddr + seg.vmsize; |
| 2400 | } |
| 2401 | |
| 2402 | 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 | }); |
| 2408 | } |
| 2409 | |
| 2404 | 2410 | fn initDyldInfoSections(self: *MachO) !void { |
| 2405 | 2411 | const tracy = trace(@src()); |
| 2406 | 2412 | defer tracy.end(); |