| ... | @@ -780,7 +780,7 @@ pub fn flush(self: *MachO, comp: *Compilation) !void { | ... | @@ -780,7 +780,7 @@ pub fn flush(self: *MachO, comp: *Compilation) !void { |
| 780 | } | 780 | } |
| 781 | | 781 | |
| 782 | try self.parseTextBlocks(); | 782 | try self.parseTextBlocks(); |
| 783 | try self.sortSections(); | 783 | // try self.sortSections(); |
| 784 | try self.allocateTextSegment(); | 784 | try self.allocateTextSegment(); |
| 785 | try self.allocateDataConstSegment(); | 785 | try self.allocateDataConstSegment(); |
| 786 | try self.allocateDataSegment(); | 786 | try self.allocateDataSegment(); |
| ... | @@ -4163,6 +4163,110 @@ pub fn populateMissingMetadata(self: *MachO) !void { | ... | @@ -4163,6 +4163,110 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 4163 | self.load_commands_dirty = true; | 4163 | self.load_commands_dirty = true; |
| 4164 | } | 4164 | } |
| 4165 | | 4165 | |
| | 4166 | if (self.tlv_section_index == null) { |
| | 4167 | const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| | 4168 | self.tlv_section_index = @intCast(u16, data_segment.sections.items.len); |
| | 4169 | |
| | 4170 | const needed_size = @sizeOf(u64) * self.base.options.symbol_count_hint; |
| | 4171 | const off = data_segment.findFreeSpace(needed_size, @alignOf(u64), null); |
| | 4172 | assert(off + needed_size <= data_segment.inner.fileoff + data_segment.inner.filesize); // TODO Must expand __DATA segment. |
| | 4173 | |
| | 4174 | log.debug("found __thread_vars section free space 0x{x} to 0x{x}", .{ off, off + needed_size }); |
| | 4175 | |
| | 4176 | try data_segment.addSection(self.base.allocator, "__thread_vars", .{ |
| | 4177 | .addr = data_segment.inner.vmaddr + off - data_segment.inner.fileoff, |
| | 4178 | .size = needed_size, |
| | 4179 | .offset = @intCast(u32, off), |
| | 4180 | .@"align" = 3, // 2^3 = @sizeOf(u64) |
| | 4181 | .flags = macho.S_THREAD_LOCAL_VARIABLES, |
| | 4182 | }); |
| | 4183 | const match = MatchingSection{ |
| | 4184 | .seg = self.data_segment_cmd_index.?, |
| | 4185 | .sect = self.tlv_section_index.?, |
| | 4186 | }; |
| | 4187 | _ = try self.section_ordinals.getOrPut(self.base.allocator, match); |
| | 4188 | try self.block_free_lists.putNoClobber(self.base.allocator, match, .{}); |
| | 4189 | self.load_commands_dirty = true; |
| | 4190 | } |
| | 4191 | |
| | 4192 | if (self.tlv_data_section_index == null) { |
| | 4193 | const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| | 4194 | self.tlv_data_section_index = @intCast(u16, data_segment.sections.items.len); |
| | 4195 | |
| | 4196 | const needed_size = @sizeOf(u64) * self.base.options.symbol_count_hint; |
| | 4197 | const off = data_segment.findFreeSpace(needed_size, @alignOf(u64), null); |
| | 4198 | assert(off + needed_size <= data_segment.inner.fileoff + data_segment.inner.filesize); // TODO Must expand __DATA segment. |
| | 4199 | |
| | 4200 | log.debug("found __thread_data section free space 0x{x} to 0x{x}", .{ off, off + needed_size }); |
| | 4201 | |
| | 4202 | try data_segment.addSection(self.base.allocator, "__thread_data", .{ |
| | 4203 | .addr = data_segment.inner.vmaddr + off - data_segment.inner.fileoff, |
| | 4204 | .size = needed_size, |
| | 4205 | .offset = @intCast(u32, off), |
| | 4206 | .@"align" = 3, // 2^3 = @sizeOf(u64) |
| | 4207 | .flags = macho.S_THREAD_LOCAL_REGULAR, |
| | 4208 | }); |
| | 4209 | const match = MatchingSection{ |
| | 4210 | .seg = self.data_segment_cmd_index.?, |
| | 4211 | .sect = self.tlv_data_section_index.?, |
| | 4212 | }; |
| | 4213 | _ = try self.section_ordinals.getOrPut(self.base.allocator, match); |
| | 4214 | try self.block_free_lists.putNoClobber(self.base.allocator, match, .{}); |
| | 4215 | self.load_commands_dirty = true; |
| | 4216 | } |
| | 4217 | |
| | 4218 | if (self.tlv_bss_section_index == null) { |
| | 4219 | const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| | 4220 | self.tlv_bss_section_index = @intCast(u16, data_segment.sections.items.len); |
| | 4221 | |
| | 4222 | const needed_size = @sizeOf(u64) * self.base.options.symbol_count_hint; |
| | 4223 | const off = data_segment.findFreeSpace(needed_size, @alignOf(u64), null); |
| | 4224 | assert(off + needed_size <= data_segment.inner.fileoff + data_segment.inner.filesize); // TODO Must expand __DATA segment. |
| | 4225 | |
| | 4226 | log.debug("found __thread_bss section free space 0x{x} to 0x{x}", .{ off, off + needed_size }); |
| | 4227 | |
| | 4228 | try data_segment.addSection(self.base.allocator, "__thread_bss", .{ |
| | 4229 | .addr = data_segment.inner.vmaddr + off - data_segment.inner.fileoff, |
| | 4230 | .size = needed_size, |
| | 4231 | .offset = @intCast(u32, off), |
| | 4232 | .@"align" = 3, // 2^3 = @sizeOf(u64) |
| | 4233 | .flags = macho.S_THREAD_LOCAL_ZEROFILL, |
| | 4234 | }); |
| | 4235 | const match = MatchingSection{ |
| | 4236 | .seg = self.data_segment_cmd_index.?, |
| | 4237 | .sect = self.tlv_bss_section_index.?, |
| | 4238 | }; |
| | 4239 | _ = try self.section_ordinals.getOrPut(self.base.allocator, match); |
| | 4240 | try self.block_free_lists.putNoClobber(self.base.allocator, match, .{}); |
| | 4241 | self.load_commands_dirty = true; |
| | 4242 | } |
| | 4243 | |
| | 4244 | if (self.bss_section_index == null) { |
| | 4245 | const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| | 4246 | self.bss_section_index = @intCast(u16, data_segment.sections.items.len); |
| | 4247 | |
| | 4248 | const needed_size = @sizeOf(u64) * self.base.options.symbol_count_hint; |
| | 4249 | const off = data_segment.findFreeSpace(needed_size, @alignOf(u64), null); |
| | 4250 | assert(off + needed_size <= data_segment.inner.fileoff + data_segment.inner.filesize); // TODO Must expand __DATA segment. |
| | 4251 | |
| | 4252 | log.debug("found __bss section free space 0x{x} to 0x{x}", .{ off, off + needed_size }); |
| | 4253 | |
| | 4254 | try data_segment.addSection(self.base.allocator, "__bss", .{ |
| | 4255 | .addr = data_segment.inner.vmaddr + off - data_segment.inner.fileoff, |
| | 4256 | .size = 0, |
| | 4257 | .offset = @intCast(u32, off), |
| | 4258 | .@"align" = 3, // 2^3 = @sizeOf(u64) |
| | 4259 | .flags = macho.S_ZEROFILL, |
| | 4260 | }); |
| | 4261 | const match = MatchingSection{ |
| | 4262 | .seg = self.data_segment_cmd_index.?, |
| | 4263 | .sect = self.bss_section_index.?, |
| | 4264 | }; |
| | 4265 | _ = try self.section_ordinals.getOrPut(self.base.allocator, match); |
| | 4266 | try self.block_free_lists.putNoClobber(self.base.allocator, match, .{}); |
| | 4267 | self.load_commands_dirty = true; |
| | 4268 | } |
| | 4269 | |
| 4166 | if (self.linkedit_segment_cmd_index == null) { | 4270 | if (self.linkedit_segment_cmd_index == null) { |
| 4167 | self.linkedit_segment_cmd_index = @intCast(u16, self.load_commands.items.len); | 4271 | self.linkedit_segment_cmd_index = @intCast(u16, self.load_commands.items.len); |
| 4168 | const address_and_offset = self.nextSegmentAddressAndOffset(); | 4272 | const address_and_offset = self.nextSegmentAddressAndOffset(); |