authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-20 08:41:55+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:42+01:00
loga531ecf9dc104895741c46901989d400ad4e3043
tree8ce82d437e8eb23bf123ac0865d6789cb4e04987
parenteaf4bb442300adb4cedebf918738028e074a01b3

macho: refactor segment creation logic


1 files changed, 17 insertions(+), 39 deletions(-)

src/link/MachO.zig+17-39
......@@ -2203,20 +2203,6 @@ fn initSegments(self: *MachO) !void {
22032203 const gpa = self.base.comp.gpa;
22042204 const slice = self.sections.slice();
22052205
2206 // First, create segments required by sections
2207 for (slice.items(.header)) |header| {
2208 const segname = header.segName();
2209 if (self.getSegmentByName(segname) == null) {
2210 const prot = getSegmentProt(segname);
2211 try self.segments.append(gpa, .{
2212 .cmdsize = @sizeOf(macho.segment_command_64),
2213 .segname = makeStaticString(segname),
2214 .maxprot = prot,
2215 .initprot = prot,
2216 });
2217 }
2218 }
2219
22202206 // Add __PAGEZERO if required
22212207 const pagezero_size = self.pagezero_size orelse default_pagezero_size;
22222208 const aligned_pagezero_size = mem.alignBackward(u64, pagezero_size, self.getPageSize());
......@@ -2226,44 +2212,30 @@ fn initSegments(self: *MachO) !void {
22262212 log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_size});
22272213 log.warn(" rounding down to 0x{x}", .{aligned_pagezero_size});
22282214 }
2229 try self.segments.append(gpa, .{
2230 .cmdsize = @sizeOf(macho.segment_command_64),
2231 .segname = makeStaticString("__PAGEZERO"),
2232 .vmsize = aligned_pagezero_size,
2233 });
2215 _ = try self.addSegment("__PAGEZERO", .{ .vmsize = aligned_pagezero_size });
22342216 }
22352217
22362218 // __TEXT segment is non-optional
2237 if (self.getSegmentByName("__TEXT") == null) {
2238 const protection = getSegmentProt("__TEXT");
2239 try self.segments.append(gpa, .{
2240 .cmdsize = @sizeOf(macho.segment_command_64),
2241 .segname = makeStaticString("__TEXT"),
2242 .maxprot = protection,
2243 .initprot = protection,
2244 });
2219 _ = try self.addSegment("__TEXT", .{ .prot = getSegmentProt("__TEXT") });
2220
2221 // Next, create segments required by sections
2222 for (slice.items(.header)) |header| {
2223 const segname = header.segName();
2224 if (self.getSegmentByName(segname) == null) {
2225 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) });
2226 }
22452227 }
22462228
22472229 // Add __LINKEDIT
2248 {
2249 const protection = getSegmentProt("__LINKEDIT");
2250 self.linkedit_seg_index = @intCast(self.segments.items.len);
2251 try self.segments.append(gpa, .{
2252 .cmdsize = @sizeOf(macho.segment_command_64),
2253 .segname = makeStaticString("__LINKEDIT"),
2254 .maxprot = protection,
2255 .initprot = protection,
2256 });
2257 }
2230 _ = try self.addSegment("__LINKEDIT", .{ .prot = getSegmentProt("__LINKEDIT") });
22582231
2232 // Sort segments
22592233 const sortFn = struct {
22602234 fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool {
22612235 _ = ctx;
22622236 return getSegmentRank(lhs.segName()) < getSegmentRank(rhs.segName());
22632237 }
22642238 }.sortFn;
2265
2266 // Sort segments
22672239 mem.sort(macho.segment_command_64, self.segments.items, {}, sortFn);
22682240
22692241 // Attach sections to segments
......@@ -2288,6 +2260,12 @@ fn initSegments(self: *MachO) !void {
22882260
22892261 self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO");
22902262 self.text_seg_index = self.getSegmentByName("__TEXT").?;
2263 self.linkedit_seg_index = self.getSegmentByName("__LINKEDIT").?;
2264 self.zig_text_seg_index = self.getSegmentByName("__TEXT_ZIG");
2265 self.zig_got_seg_index = self.getSegmentByName("__GOT_ZIG");
2266 self.zig_const_seg_index = self.getSegmentByName("__CONST_ZIG");
2267 self.zig_data_seg_index = self.getSegmentByName("__DATA_ZIG");
2268 self.zig_bss_seg_index = self.getSegmentByName("__BSS_ZIG");
22912269}
22922270
22932271fn allocateSections(self: *MachO) !void {