| ... | @@ -592,6 +592,8 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node | ... | @@ -592,6 +592,8 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 592 | self.allocateAtoms(); | 592 | self.allocateAtoms(); |
| 593 | self.allocateSyntheticSymbols(); | 593 | self.allocateSyntheticSymbols(); |
| 594 | | 594 | |
| | 595 | try self.initLinkeditSegment(); |
| | 596 | |
| 595 | state_log.debug("{}", .{self.dumpState()}); | 597 | state_log.debug("{}", .{self.dumpState()}); |
| 596 | | 598 | |
| 597 | try self.initDyldInfoSections(); | 599 | try self.initDyldInfoSections(); |
| ... | @@ -2167,18 +2169,6 @@ fn initSegments(self: *MachO) !void { | ... | @@ -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 | // __TEXT segment is non-optional | 2172 | // __TEXT segment is non-optional |
| 2183 | if (self.getSegmentByName("__TEXT") == null) { | 2173 | if (self.getSegmentByName("__TEXT") == null) { |
| 2184 | const protection = getSegmentProt("__TEXT"); | 2174 | const protection = getSegmentProt("__TEXT"); |
| ... | @@ -2222,7 +2212,6 @@ fn initSegments(self: *MachO) !void { | ... | @@ -2222,7 +2212,6 @@ fn initSegments(self: *MachO) !void { |
| 2222 | | 2212 | |
| 2223 | self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO"); | 2213 | self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO"); |
| 2224 | self.text_seg_index = self.getSegmentByName("__TEXT").?; | 2214 | self.text_seg_index = self.getSegmentByName("__TEXT").?; |
| 2225 | self.linkedit_seg_index = self.getSegmentByName("__LINKEDIT").?; | | |
| 2226 | } | 2215 | } |
| 2227 | | 2216 | |
| 2228 | fn allocateSections(self: *MachO) !void { | 2217 | fn allocateSections(self: *MachO) !void { |
| ... | @@ -2401,6 +2390,23 @@ fn allocateSyntheticSymbols(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 | fn initDyldInfoSections(self: *MachO) !void { | 2410 | fn initDyldInfoSections(self: *MachO) !void { |
| 2405 | const tracy = trace(@src()); | 2411 | const tracy = trace(@src()); |
| 2406 | defer tracy.end(); | 2412 | defer tracy.end(); |