authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-19 17:26:47+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:41+01:00
logf4da8145358cccd92018838a6f890f3a229f7df8
tree5b167c833b37deec70741ff58d2c0fe781138f00
parent1bdcb23b137b65696d7cad4adcc85697d359995a

macho: init linkedit segment separately


1 files changed, 19 insertions(+), 13 deletions(-)

src/link/MachO.zig+19-13
...@@ -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();
594594
595 try self.initLinkeditSegment();
596
595 state_log.debug("{}", .{self.dumpState()});597 state_log.debug("{}", .{self.dumpState()});
596598
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 }
21692171
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-optional2172 // __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 {
22222212
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}
22272216
2228fn allocateSections(self: *MachO) !void {2217fn 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}
24032392
2393fn 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
2404fn initDyldInfoSections(self: *MachO) !void {2410fn initDyldInfoSections(self: *MachO) !void {
2405 const tracy = trace(@src());2411 const tracy = trace(@src());
2406 defer tracy.end();2412 defer tracy.end();