authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-19 18:01:14+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:41+01:00
log16b66588f02743aafeb5972644271d92bdcf1051
treebcae03fb03427f0a0e3aa6b48d44177506478320
parentf4da8145358cccd92018838a6f890f3a229f7df8

macho: allocate __LINKEDIT in a separate pass


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

src/link/MachO.zig+19-9
...@@ -591,8 +591,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node...@@ -591,8 +591,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
591 self.allocateSegments();591 self.allocateSegments();
592 self.allocateAtoms();592 self.allocateAtoms();
593 self.allocateSyntheticSymbols();593 self.allocateSyntheticSymbols();
594594 try self.allocateLinkeditSegment();
595 try self.initLinkeditSegment();
596595
597 state_log.debug("{}", .{self.dumpState()});596 state_log.debug("{}", .{self.dumpState()});
598597
...@@ -2180,6 +2179,18 @@ fn initSegments(self: *MachO) !void {...@@ -2180,6 +2179,18 @@ fn initSegments(self: *MachO) !void {
2180 });2179 });
2181 }2180 }
21822181
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 const sortFn = struct {2194 const sortFn = struct {
2184 fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool {2195 fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool {
2185 _ = ctx;2196 _ = ctx;
...@@ -2261,10 +2272,11 @@ fn allocateSegments(self: *MachO) void {...@@ -2261,10 +2272,11 @@ fn allocateSegments(self: *MachO) void {
2261 0;2272 0;
2262 var fileoff: u64 = 0;2273 var fileoff: u64 = 0;
2263 const index = if (self.pagezero_seg_index) |index| index + 1 else 0;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!
22642276
2265 const slice = self.sections.slice();2277 const slice = self.sections.slice();
2266 var next_sect_id: u8 = 0;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 if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| {2280 if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| {
2269 vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size);2281 vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size);
2270 if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) {2282 if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) {
...@@ -2390,7 +2402,7 @@ fn allocateSyntheticSymbols(self: *MachO) void {...@@ -2390,7 +2402,7 @@ fn allocateSyntheticSymbols(self: *MachO) void {
2390 }2402 }
2391}2403}
23922404
2393fn initLinkeditSegment(self: *MachO) !void {2405fn allocateLinkeditSegment(self: *MachO) !void {
2394 var fileoff: u64 = 0;2406 var fileoff: u64 = 0;
2395 var vmaddr: u64 = 0;2407 var vmaddr: u64 = 0;
23962408
...@@ -2400,11 +2412,9 @@ fn initLinkeditSegment(self: *MachO) !void {...@@ -2400,11 +2412,9 @@ fn initLinkeditSegment(self: *MachO) !void {
2400 }2412 }
24012413
2402 const page_size = self.getPageSize();2414 const page_size = self.getPageSize();
2403 self.linkedit_seg_index = try self.addSegment("__LINKEDIT", .{2415 const seg = self.getLinkeditSegment();
2404 .vmaddr = mem.alignForward(u64, vmaddr, page_size),2416 seg.vmaddr = mem.alignForward(u64, vmaddr, page_size);
2405 .fileoff = mem.alignForward(u64, fileoff, page_size),2417 seg.fileoff = mem.alignForward(u64, fileoff, page_size);
2406 .prot = getSegmentProt("__LINKEDIT"),
2407 });
2408}2418}
24092419
2410fn initDyldInfoSections(self: *MachO) !void {2420fn initDyldInfoSections(self: *MachO) !void {