authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-09 12:48:23+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-09 12:48:25+01:00
logb5d2be108243e7f2b6af0cb8085b382ed00e6036
treee1950d14b493e363617a417d037bdffeabc672b7
parent925273bcc8b92b84e1880a20e25fa8507ac904bd

macho: undo invalid fix for allocating sections for relocatable

This is way too buggy for my taste. I will need to revisit segment/section alloc logic.

1 files changed, 46 insertions(+), 53 deletions(-)

src/link/MachO.zig+46-53
...@@ -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);
22982298
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 });
23052305
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 {
32003200
3201 const end = start + padToIdeal(size);3201 const end = start + padToIdeal(size);
32023202
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 }
32213219
...@@ -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 {
32313229
3232 const end = start + padToIdeal(size);3230 const end = start + padToIdeal(size);
32333231
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 }
32513247
...@@ -3257,16 +3253,14 @@ pub fn allocatedSize(self: *MachO, start: u64) u64 {...@@ -3257,16 +3253,14 @@ pub fn allocatedSize(self: *MachO, start: u64) u64 {
32573253
3258 var min_pos: u64 = std.math.maxInt(u64);3254 var min_pos: u64 = std.math.maxInt(u64);
32593255
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 }
32713265
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 {
32773271
3278 var min_pos: u64 = std.math.maxInt(u64);3272 var min_pos: u64 = std.math.maxInt(u64);
32793273
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}
32933286
...@@ -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);
35593552
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 });
35663559
3567 try self.copyRangeAllZeroOut(sect.offset, new_offset, existing_size);3560 try self.copyRangeAllZeroOut(sect.offset, new_offset, existing_size);