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 {...@@ -2203,20 +2203,6 @@ fn initSegments(self: *MachO) !void {
2203 const gpa = self.base.comp.gpa;2203 const gpa = self.base.comp.gpa;
2204 const slice = self.sections.slice();2204 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
2220 // Add __PAGEZERO if required2206 // Add __PAGEZERO if required
2221 const pagezero_size = self.pagezero_size orelse default_pagezero_size;2207 const pagezero_size = self.pagezero_size orelse default_pagezero_size;
2222 const aligned_pagezero_size = mem.alignBackward(u64, pagezero_size, self.getPageSize());2208 const aligned_pagezero_size = mem.alignBackward(u64, pagezero_size, self.getPageSize());
...@@ -2226,44 +2212,30 @@ fn initSegments(self: *MachO) !void {...@@ -2226,44 +2212,30 @@ fn initSegments(self: *MachO) !void {
2226 log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_size});2212 log.warn("requested __PAGEZERO size (0x{x}) is not page aligned", .{pagezero_size});
2227 log.warn(" rounding down to 0x{x}", .{aligned_pagezero_size});2213 log.warn(" rounding down to 0x{x}", .{aligned_pagezero_size});
2228 }2214 }
2229 try self.segments.append(gpa, .{2215 _ = try self.addSegment("__PAGEZERO", .{ .vmsize = aligned_pagezero_size });
2230 .cmdsize = @sizeOf(macho.segment_command_64),
2231 .segname = makeStaticString("__PAGEZERO"),
2232 .vmsize = aligned_pagezero_size,
2233 });
2234 }2216 }
22352217
2236 // __TEXT segment is non-optional2218 // __TEXT segment is non-optional
2237 if (self.getSegmentByName("__TEXT") == null) {2219 _ = try self.addSegment("__TEXT", .{ .prot = getSegmentProt("__TEXT") });
2238 const protection = getSegmentProt("__TEXT");2220
2239 try self.segments.append(gpa, .{2221 // Next, create segments required by sections
2240 .cmdsize = @sizeOf(macho.segment_command_64),2222 for (slice.items(.header)) |header| {
2241 .segname = makeStaticString("__TEXT"),2223 const segname = header.segName();
2242 .maxprot = protection,2224 if (self.getSegmentByName(segname) == null) {
2243 .initprot = protection,2225 _ = try self.addSegment(segname, .{ .prot = getSegmentProt(segname) });
2244 });2226 }
2245 }2227 }
22462228
2247 // Add __LINKEDIT2229 // Add __LINKEDIT
2248 {2230 _ = try self.addSegment("__LINKEDIT", .{ .prot = getSegmentProt("__LINKEDIT") });
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 }
22582231
2232 // Sort segments
2259 const sortFn = struct {2233 const sortFn = struct {
2260 fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool {2234 fn sortFn(ctx: void, lhs: macho.segment_command_64, rhs: macho.segment_command_64) bool {
2261 _ = ctx;2235 _ = ctx;
2262 return getSegmentRank(lhs.segName()) < getSegmentRank(rhs.segName());2236 return getSegmentRank(lhs.segName()) < getSegmentRank(rhs.segName());
2263 }2237 }
2264 }.sortFn;2238 }.sortFn;
2265
2266 // Sort segments
2267 mem.sort(macho.segment_command_64, self.segments.items, {}, sortFn);2239 mem.sort(macho.segment_command_64, self.segments.items, {}, sortFn);
22682240
2269 // Attach sections to segments2241 // Attach sections to segments
...@@ -2288,6 +2260,12 @@ fn initSegments(self: *MachO) !void {...@@ -2288,6 +2260,12 @@ fn initSegments(self: *MachO) !void {
22882260
2289 self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO");2261 self.pagezero_seg_index = self.getSegmentByName("__PAGEZERO");
2290 self.text_seg_index = self.getSegmentByName("__TEXT").?;2262 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");
2291}2269}
22922270
2293fn allocateSections(self: *MachO) !void {2271fn allocateSections(self: *MachO) !void {