| ... | @@ -2296,11 +2296,11 @@ fn allocateSections(self: *MachO) !void { | ... | @@ -2296,11 +2296,11 @@ fn allocateSections(self: *MachO) !void { |
| 2296 | // Must move the entire section. | 2296 | // Must move the entire section. |
| 2297 | const new_offset = self.findFreeSpace(existing_size, page_size); | 2297 | const new_offset = self.findFreeSpace(existing_size, page_size); |
| 2298 | | 2298 | |
| 2299 | log.debug("new '{s},{s}' file offset 0x{x} to 0x{x}", .{ | 2299 | log.debug("moving '{s},{s}' from 0x{x} to 0x{x}", .{ |
| 2300 | header.segName(), | 2300 | header.segName(), |
| 2301 | header.sectName(), | 2301 | header.sectName(), |
| | 2302 | header.offset, |
| 2302 | new_offset, | 2303 | new_offset, |
| 2303 | new_offset + existing_size, | | |
| 2304 | }); | 2304 | }); |
| 2305 | | 2305 | |
| 2306 | try self.copyRangeAllZeroOut(header.offset, new_offset, existing_size); | 2306 | try self.copyRangeAllZeroOut(header.offset, new_offset, existing_size); |
| ... | @@ -3200,22 +3200,20 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { | ... | @@ -3200,22 +3200,20 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { |
| 3200 | | 3200 | |
| 3201 | const end = start + padToIdeal(size); | 3201 | const end = start + padToIdeal(size); |
| 3202 | | 3202 | |
| 3203 | if (self.base.isRelocatable()) { | 3203 | for (self.sections.items(.header)) |header| { |
| 3204 | for (self.sections.items(.header)) |header| { | 3204 | if (header.isZerofill()) continue; |
| 3205 | if (header.isZerofill()) continue; | 3205 | const increased_size = padToIdeal(header.size); |
| 3206 | const increased_size = padToIdeal(header.size); | 3206 | const test_end = header.offset +| increased_size; |
| 3207 | const test_end = header.offset +| increased_size; | 3207 | if (end > header.offset and start < test_end) { |
| 3208 | if (end > header.offset and start < test_end) { | 3208 | return test_end; |
| 3209 | return test_end; | | |
| 3210 | } | | |
| 3211 | } | 3209 | } |
| 3212 | } else { | 3210 | } |
| 3213 | for (self.segments.items) |seg| { | 3211 | |
| 3214 | const increased_size = padToIdeal(seg.filesize); | 3212 | for (self.segments.items) |seg| { |
| 3215 | const test_end = seg.fileoff +| increased_size; | 3213 | const increased_size = padToIdeal(seg.filesize); |
| 3216 | if (end > seg.fileoff and start < test_end) { | 3214 | const test_end = seg.fileoff +| increased_size; |
| 3217 | return test_end; | 3215 | if (end > seg.fileoff and start < test_end) { |
| 3218 | } | 3216 | return test_end; |
| 3219 | } | 3217 | } |
| 3220 | } | 3218 | } |
| 3221 | | 3219 | |
| ... | @@ -3231,21 +3229,19 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { | ... | @@ -3231,21 +3229,19 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { |
| 3231 | | 3229 | |
| 3232 | const end = start + padToIdeal(size); | 3230 | const end = start + padToIdeal(size); |
| 3233 | | 3231 | |
| 3234 | if (self.base.isRelocatable()) { | 3232 | for (self.sections.items(.header)) |header| { |
| 3235 | for (self.sections.items(.header)) |header| { | 3233 | const increased_size = padToIdeal(header.size); |
| 3236 | const increased_size = padToIdeal(header.size); | 3234 | const test_end = header.addr +| increased_size; |
| 3237 | const test_end = header.addr +| increased_size; | 3235 | if (end > header.addr and start < test_end) { |
| 3238 | if (end > header.addr and start < test_end) { | 3236 | return test_end; |
| 3239 | return test_end; | | |
| 3240 | } | | |
| 3241 | } | 3237 | } |
| 3242 | } else { | 3238 | } |
| 3243 | for (self.segments.items) |seg| { | 3239 | |
| 3244 | const increased_size = padToIdeal(seg.vmsize); | 3240 | for (self.segments.items) |seg| { |
| 3245 | const test_end = seg.vmaddr +| increased_size; | 3241 | const increased_size = padToIdeal(seg.vmsize); |
| 3246 | if (end > seg.vmaddr and start < test_end) { | 3242 | const test_end = seg.vmaddr +| increased_size; |
| 3247 | return test_end; | 3243 | if (end > seg.vmaddr and start < test_end) { |
| 3248 | } | 3244 | return test_end; |
| 3249 | } | 3245 | } |
| 3250 | } | 3246 | } |
| 3251 | | 3247 | |
| ... | @@ -3257,16 +3253,14 @@ pub fn allocatedSize(self: *MachO, start: u64) u64 { | ... | @@ -3257,16 +3253,14 @@ pub fn allocatedSize(self: *MachO, start: u64) u64 { |
| 3257 | | 3253 | |
| 3258 | var min_pos: u64 = std.math.maxInt(u64); | 3254 | var min_pos: u64 = std.math.maxInt(u64); |
| 3259 | | 3255 | |
| 3260 | if (self.base.isRelocatable()) { | 3256 | for (self.sections.items(.header)) |header| { |
| 3261 | for (self.sections.items(.header)) |header| { | 3257 | if (header.offset <= start) continue; |
| 3262 | if (header.offset <= start) continue; | 3258 | if (header.offset < min_pos) min_pos = header.offset; |
| 3263 | if (header.offset < min_pos) min_pos = header.offset; | 3259 | } |
| 3264 | } | 3260 | |
| 3265 | } else { | 3261 | for (self.segments.items) |seg| { |
| 3266 | for (self.segments.items) |seg| { | 3262 | if (seg.fileoff <= start) continue; |
| 3267 | if (seg.fileoff <= start) continue; | 3263 | if (seg.fileoff < min_pos) min_pos = seg.fileoff; |
| 3268 | if (seg.fileoff < min_pos) min_pos = seg.fileoff; | | |
| 3269 | } | | |
| 3270 | } | 3264 | } |
| 3271 | | 3265 | |
| 3272 | return min_pos - start; | 3266 | return min_pos - start; |
| ... | @@ -3277,17 +3271,16 @@ pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 { | ... | @@ -3277,17 +3271,16 @@ pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 { |
| 3277 | | 3271 | |
| 3278 | var min_pos: u64 = std.math.maxInt(u64); | 3272 | var min_pos: u64 = std.math.maxInt(u64); |
| 3279 | | 3273 | |
| 3280 | if (self.base.isRelocatable()) { | 3274 | for (self.sections.items(.header)) |header| { |
| 3281 | for (self.sections.items(.header)) |header| { | 3275 | if (header.addr <= start) continue; |
| 3282 | if (header.addr <= start) continue; | 3276 | if (header.addr < min_pos) min_pos = header.addr; |
| 3283 | if (header.addr < min_pos) min_pos = header.addr; | 3277 | } |
| 3284 | } | 3278 | |
| 3285 | } else { | 3279 | for (self.segments.items) |seg| { |
| 3286 | for (self.segments.items) |seg| { | 3280 | if (seg.vmaddr <= start) continue; |
| 3287 | if (seg.vmaddr <= start) continue; | 3281 | if (seg.vmaddr < min_pos) min_pos = seg.vmaddr; |
| 3288 | if (seg.vmaddr < min_pos) min_pos = seg.vmaddr; | | |
| 3289 | } | | |
| 3290 | } | 3282 | } |
| | 3283 | |
| 3291 | return min_pos - start; | 3284 | return min_pos - start; |
| 3292 | } | 3285 | } |
| 3293 | | 3286 | |
| ... | @@ -3557,11 +3550,11 @@ fn growSectionNonRelocatable(self: *MachO, sect_index: u8, needed_size: u64) !vo | ... | @@ -3557,11 +3550,11 @@ fn growSectionNonRelocatable(self: *MachO, sect_index: u8, needed_size: u64) !vo |
| 3557 | const alignment = self.getPageSize(); | 3550 | const alignment = self.getPageSize(); |
| 3558 | const new_offset = self.findFreeSpace(needed_size, alignment); | 3551 | const new_offset = self.findFreeSpace(needed_size, alignment); |
| 3559 | | 3552 | |
| 3560 | log.debug("new '{s},{s}' file offset 0x{x} to 0x{x}", .{ | 3553 | log.debug("moving '{s},{s}' from 0x{x} to 0x{x}", .{ |
| 3561 | sect.segName(), | 3554 | sect.segName(), |
| 3562 | sect.sectName(), | 3555 | sect.sectName(), |
| | 3556 | sect.offset, |
| 3563 | new_offset, | 3557 | new_offset, |
| 3564 | new_offset + existing_size, | | |
| 3565 | }); | 3558 | }); |
| 3566 | | 3559 | |
| 3567 | try self.copyRangeAllZeroOut(sect.offset, new_offset, existing_size); | 3560 | try self.copyRangeAllZeroOut(sect.offset, new_offset, existing_size); |