| ... | @@ -40,6 +40,7 @@ codesig_cmd: macho.linkedit_data_command = .{ .cmd = .CODE_SIGNATURE }, | ... | @@ -40,6 +40,7 @@ codesig_cmd: macho.linkedit_data_command = .{ .cmd = .CODE_SIGNATURE }, |
| 40 | pagezero_seg_index: ?u8 = null, | 40 | pagezero_seg_index: ?u8 = null, |
| 41 | text_seg_index: ?u8 = null, | 41 | text_seg_index: ?u8 = null, |
| 42 | linkedit_seg_index: ?u8 = null, | 42 | linkedit_seg_index: ?u8 = null, |
| | 43 | text_sect_index: ?u8 = null, |
| 43 | data_sect_index: ?u8 = null, | 44 | data_sect_index: ?u8 = null, |
| 44 | got_sect_index: ?u8 = null, | 45 | got_sect_index: ?u8 = null, |
| 45 | stubs_sect_index: ?u8 = null, | 46 | stubs_sect_index: ?u8 = null, |
| ... | @@ -1757,6 +1758,17 @@ fn initOutputSections(self: *MachO) !void { | ... | @@ -1757,6 +1758,17 @@ fn initOutputSections(self: *MachO) !void { |
| 1757 | atom.out_n_sect = try Atom.initOutputSection(atom.getInputSection(self), self); | 1758 | atom.out_n_sect = try Atom.initOutputSection(atom.getInputSection(self), self); |
| 1758 | } | 1759 | } |
| 1759 | } | 1760 | } |
| | 1761 | if (self.text_sect_index == null) { |
| | 1762 | self.text_sect_index = try self.addSection("__TEXT", "__text", .{ |
| | 1763 | .alignment = switch (self.getTarget().cpu.arch) { |
| | 1764 | .x86_64 => 0, |
| | 1765 | .aarch64 => 2, |
| | 1766 | else => unreachable, |
| | 1767 | }, |
| | 1768 | .flags = macho.S_SYMBOL_STUBS | |
| | 1769 | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, |
| | 1770 | }); |
| | 1771 | } |
| 1760 | if (self.data_sect_index == null) { | 1772 | if (self.data_sect_index == null) { |
| 1761 | self.data_sect_index = try self.addSection("__DATA", "__data", .{}); | 1773 | self.data_sect_index = try self.addSection("__DATA", "__data", .{}); |
| 1762 | } | 1774 | } |
| ... | @@ -2227,21 +2239,25 @@ fn allocateSections(self: *MachO) !void { | ... | @@ -2227,21 +2239,25 @@ fn allocateSections(self: *MachO) !void { |
| 2227 | | 2239 | |
| 2228 | var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0; | 2240 | var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0; |
| 2229 | for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| { | 2241 | for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| { |
| 2230 | if (seg_id != next_seg_id) { | 2242 | if (mem.indexOf(u8, header.segName(), "ZIG")) |_| { |
| 2231 | vmaddr = mem.alignForward(u64, vmaddr, page_size); | 2243 | vmaddr = header.addr + header.size; |
| 2232 | fileoff = mem.alignForward(u32, fileoff, page_size); | 2244 | } else { |
| 2233 | } | 2245 | if (seg_id != next_seg_id) { |
| | 2246 | vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| | 2247 | fileoff = mem.alignForward(u32, fileoff, page_size); |
| | 2248 | } |
| 2234 | | 2249 | |
| 2235 | const alignment = try math.powi(u32, 2, header.@"align"); | 2250 | const alignment = try math.powi(u32, 2, header.@"align"); |
| 2236 | | 2251 | |
| 2237 | vmaddr = mem.alignForward(u64, vmaddr, alignment); | 2252 | vmaddr = mem.alignForward(u64, vmaddr, alignment); |
| 2238 | header.addr = vmaddr; | 2253 | header.addr = vmaddr; |
| 2239 | vmaddr += header.size; | 2254 | vmaddr += header.size; |
| 2240 | | 2255 | |
| 2241 | if (!header.isZerofill()) { | 2256 | if (!header.isZerofill()) { |
| 2242 | fileoff = mem.alignForward(u32, fileoff, alignment); | 2257 | fileoff = mem.alignForward(u32, fileoff, alignment); |
| 2243 | header.offset = fileoff; | 2258 | header.offset = fileoff; |
| 2244 | fileoff += @intCast(header.size); | 2259 | fileoff += @intCast(header.size); |
| | 2260 | } |
| 2245 | } | 2261 | } |
| 2246 | | 2262 | |
| 2247 | next_seg_id = seg_id; | 2263 | next_seg_id = seg_id; |
| ... | @@ -2260,28 +2276,35 @@ fn allocateSegments(self: *MachO) void { | ... | @@ -2260,28 +2276,35 @@ fn allocateSegments(self: *MachO) void { |
| 2260 | const slice = self.sections.slice(); | 2276 | const slice = self.sections.slice(); |
| 2261 | var next_sect_id: u8 = 0; | 2277 | var next_sect_id: u8 = 0; |
| 2262 | for (self.segments.items[index..], index..) |*seg, seg_id| { | 2278 | for (self.segments.items[index..], index..) |*seg, seg_id| { |
| 2263 | seg.vmaddr = vmaddr; | 2279 | if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| { |
| 2264 | seg.fileoff = fileoff; | 2280 | vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size); |
| 2265 | | 2281 | if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) { |
| 2266 | for ( | 2282 | fileoff = mem.alignForward(u64, seg.fileoff + seg.filesize, page_size); |
| 2267 | slice.items(.header)[next_sect_id..], | | |
| 2268 | slice.items(.segment_id)[next_sect_id..], | | |
| 2269 | ) |header, sid| { | | |
| 2270 | if (seg_id != sid) break; | | |
| 2271 | | | |
| 2272 | vmaddr = header.addr + header.size; | | |
| 2273 | if (!header.isZerofill()) { | | |
| 2274 | fileoff = header.offset + header.size; | | |
| 2275 | } | 2283 | } |
| | 2284 | } else { |
| | 2285 | seg.vmaddr = vmaddr; |
| | 2286 | seg.fileoff = fileoff; |
| | 2287 | |
| | 2288 | for ( |
| | 2289 | slice.items(.header)[next_sect_id..], |
| | 2290 | slice.items(.segment_id)[next_sect_id..], |
| | 2291 | ) |header, sid| { |
| | 2292 | if (seg_id != sid) break; |
| | 2293 | |
| | 2294 | vmaddr = header.addr + header.size; |
| | 2295 | if (!header.isZerofill()) { |
| | 2296 | fileoff = header.offset + header.size; |
| | 2297 | } |
| 2276 | | 2298 | |
| 2277 | next_sect_id += 1; | 2299 | next_sect_id += 1; |
| 2278 | } | 2300 | } |
| 2279 | | 2301 | |
| 2280 | vmaddr = mem.alignForward(u64, vmaddr, page_size); | 2302 | vmaddr = mem.alignForward(u64, vmaddr, page_size); |
| 2281 | fileoff = mem.alignForward(u64, fileoff, page_size); | 2303 | fileoff = mem.alignForward(u64, fileoff, page_size); |
| 2282 | | 2304 | |
| 2283 | seg.vmsize = vmaddr - seg.vmaddr; | 2305 | seg.vmsize = vmaddr - seg.vmaddr; |
| 2284 | seg.filesize = fileoff - seg.fileoff; | 2306 | seg.filesize = fileoff - seg.fileoff; |
| | 2307 | } |
| 2285 | } | 2308 | } |
| 2286 | } | 2309 | } |
| 2287 | | 2310 | |