authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-08-26 22:22:18+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-08-29 11:39:35+02:00
logd17867939ee8a9de6bb96748e047b5e561b7606c
treedb5a8c1bea31cb2fa1fa865bc19b84279a4bf26d
parent7f74b3562deaa0dedfc2945a702fe82dbd103aa2

macho: unify writeLinkeditSegmentData func


1 files changed, 34 insertions(+), 2 deletions(-)

src/link/MachO/zld.zig+34-2
......@@ -66,6 +66,13 @@ pub const Zld = struct {
6666 segments: std.ArrayListUnmanaged(macho.segment_command_64) = .{},
6767 sections: std.MultiArrayList(Section) = .{},
6868
69 pagezero_segment_cmd_index: ?u8 = null,
70 header_segment_cmd_index: ?u8 = null,
71 text_segment_cmd_index: ?u8 = null,
72 data_const_segment_cmd_index: ?u8 = null,
73 data_segment_cmd_index: ?u8 = null,
74 linkedit_segment_cmd_index: ?u8 = null,
75
6976 text_section_index: ?u8 = null,
7077 got_section_index: ?u8 = null,
7178 tlv_ptr_section_index: ?u8 = null,
......@@ -550,6 +557,7 @@ pub const Zld = struct {
550557 log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_vmsize});
551558 log.warn(" rounding down to 0x{x}", .{aligned_pagezero_vmsize});
552559 }
560 self.pagezero_segment_cmd_index = @intCast(self.segments.items.len);
553561 try self.segments.append(self.gpa, .{
554562 .cmdsize = @sizeOf(macho.segment_command_64),
555563 .segname = makeStaticString("__PAGEZERO"),
......@@ -560,6 +568,8 @@ pub const Zld = struct {
560568 // __TEXT segment is non-optional
561569 {
562570 const protection = MachO.getSegmentMemoryProtection("__TEXT");
571 self.text_segment_cmd_index = @intCast(self.segments.items.len);
572 self.header_segment_cmd_index = self.text_segment_cmd_index.?;
563573 try self.segments.append(self.gpa, .{
564574 .cmdsize = @sizeOf(macho.segment_command_64),
565575 .segname = makeStaticString("__TEXT"),
......@@ -590,9 +600,18 @@ pub const Zld = struct {
590600 self.sections.items(.segment_index)[sect_id] = segment_id;
591601 }
592602
603 if (self.getSegmentByName("__DATA_CONST")) |index| {
604 self.data_const_segment_cmd_index = index;
605 }
606
607 if (self.getSegmentByName("__DATA")) |index| {
608 self.data_segment_cmd_index = index;
609 }
610
593611 // __LINKEDIT always comes last
594612 {
595613 const protection = MachO.getSegmentMemoryProtection("__LINKEDIT");
614 self.linkedit_segment_cmd_index = @intCast(self.segments.items.len);
596615 try self.segments.append(self.gpa, .{
597616 .cmdsize = @sizeOf(macho.segment_command_64),
598617 .segname = makeStaticString("__LINKEDIT"),
......@@ -1154,13 +1173,26 @@ pub const Zld = struct {
11541173 }
11551174
11561175 fn writeLinkeditSegmentData(self: *Zld) !void {
1176 const page_size = MachO.getPageSize(self.options.target.cpu.arch);
1177 const seg = self.getLinkeditSegmentPtr();
1178 seg.filesize = 0;
1179 seg.vmsize = 0;
1180
1181 for (self.segments.items, 0..) |segment, id| {
1182 if (self.linkedit_segment_cmd_index.? == @as(u8, @intCast(id))) continue;
1183 if (seg.vmaddr < segment.vmaddr + segment.vmsize) {
1184 seg.vmaddr = mem.alignForward(u64, segment.vmaddr + segment.vmsize, page_size);
1185 }
1186 if (seg.fileoff < segment.fileoff + segment.filesize) {
1187 seg.fileoff = mem.alignForward(u64, segment.fileoff + segment.filesize, page_size);
1188 }
1189 }
11571190 try self.writeDyldInfoData();
11581191 try self.writeFunctionStarts();
11591192 try self.writeDataInCode();
11601193 try self.writeSymtabs();
11611194
1162 const seg = self.getLinkeditSegmentPtr();
1163 seg.vmsize = mem.alignForward(u64, seg.filesize, MachO.getPageSize(self.options.target.cpu.arch));
1195 seg.vmsize = mem.alignForward(u64, seg.filesize, page_size);
11641196 }
11651197
11661198 fn collectRebaseData(self: *Zld, rebase: *Rebase) !void {