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 {
22962296 // Must move the entire section.
22972297 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}", .{
23002300 header.segName(),
23012301 header.sectName(),
2302 header.offset,
23022303 new_offset,
2303 new_offset + existing_size,
23042304 });
23052305
23062306 try self.copyRangeAllZeroOut(header.offset, new_offset, existing_size);
......@@ -3200,22 +3200,20 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 {
32003200
32013201 const end = start + padToIdeal(size);
32023202
3203 if (self.base.isRelocatable()) {
3204 for (self.sections.items(.header)) |header| {
3205 if (header.isZerofill()) continue;
3206 const increased_size = padToIdeal(header.size);
3207 const test_end = header.offset +| increased_size;
3208 if (end > header.offset and start < test_end) {
3209 return test_end;
3210 }
3203 for (self.sections.items(.header)) |header| {
3204 if (header.isZerofill()) continue;
3205 const increased_size = padToIdeal(header.size);
3206 const test_end = header.offset +| increased_size;
3207 if (end > header.offset and start < test_end) {
3208 return test_end;
32113209 }
3212 } else {
3213 for (self.segments.items) |seg| {
3214 const increased_size = padToIdeal(seg.filesize);
3215 const test_end = seg.fileoff +| increased_size;
3216 if (end > seg.fileoff and start < test_end) {
3217 return test_end;
3218 }
3210 }
3211
3212 for (self.segments.items) |seg| {
3213 const increased_size = padToIdeal(seg.filesize);
3214 const test_end = seg.fileoff +| increased_size;
3215 if (end > seg.fileoff and start < test_end) {
3216 return test_end;
32193217 }
32203218 }
32213219
......@@ -3231,21 +3229,19 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 {
32313229
32323230 const end = start + padToIdeal(size);
32333231
3234 if (self.base.isRelocatable()) {
3235 for (self.sections.items(.header)) |header| {
3236 const increased_size = padToIdeal(header.size);
3237 const test_end = header.addr +| increased_size;
3238 if (end > header.addr and start < test_end) {
3239 return test_end;
3240 }
3232 for (self.sections.items(.header)) |header| {
3233 const increased_size = padToIdeal(header.size);
3234 const test_end = header.addr +| increased_size;
3235 if (end > header.addr and start < test_end) {
3236 return test_end;
32413237 }
3242 } else {
3243 for (self.segments.items) |seg| {
3244 const increased_size = padToIdeal(seg.vmsize);
3245 const test_end = seg.vmaddr +| increased_size;
3246 if (end > seg.vmaddr and start < test_end) {
3247 return test_end;
3248 }
3238 }
3239
3240 for (self.segments.items) |seg| {
3241 const increased_size = padToIdeal(seg.vmsize);
3242 const test_end = seg.vmaddr +| increased_size;
3243 if (end > seg.vmaddr and start < test_end) {
3244 return test_end;
32493245 }
32503246 }
32513247
......@@ -3257,16 +3253,14 @@ pub fn allocatedSize(self: *MachO, start: u64) u64 {
32573253
32583254 var min_pos: u64 = std.math.maxInt(u64);
32593255
3260 if (self.base.isRelocatable()) {
3261 for (self.sections.items(.header)) |header| {
3262 if (header.offset <= start) continue;
3263 if (header.offset < min_pos) min_pos = header.offset;
3264 }
3265 } else {
3266 for (self.segments.items) |seg| {
3267 if (seg.fileoff <= start) continue;
3268 if (seg.fileoff < min_pos) min_pos = seg.fileoff;
3269 }
3256 for (self.sections.items(.header)) |header| {
3257 if (header.offset <= start) continue;
3258 if (header.offset < min_pos) min_pos = header.offset;
3259 }
3260
3261 for (self.segments.items) |seg| {
3262 if (seg.fileoff <= start) continue;
3263 if (seg.fileoff < min_pos) min_pos = seg.fileoff;
32703264 }
32713265
32723266 return min_pos - start;
......@@ -3277,17 +3271,16 @@ pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 {
32773271
32783272 var min_pos: u64 = std.math.maxInt(u64);
32793273
3280 if (self.base.isRelocatable()) {
3281 for (self.sections.items(.header)) |header| {
3282 if (header.addr <= start) continue;
3283 if (header.addr < min_pos) min_pos = header.addr;
3284 }
3285 } else {
3286 for (self.segments.items) |seg| {
3287 if (seg.vmaddr <= start) continue;
3288 if (seg.vmaddr < min_pos) min_pos = seg.vmaddr;
3289 }
3274 for (self.sections.items(.header)) |header| {
3275 if (header.addr <= start) continue;
3276 if (header.addr < min_pos) min_pos = header.addr;
3277 }
3278
3279 for (self.segments.items) |seg| {
3280 if (seg.vmaddr <= start) continue;
3281 if (seg.vmaddr < min_pos) min_pos = seg.vmaddr;
32903282 }
3283
32913284 return min_pos - start;
32923285}
32933286
......@@ -3557,11 +3550,11 @@ fn growSectionNonRelocatable(self: *MachO, sect_index: u8, needed_size: u64) !vo
35573550 const alignment = self.getPageSize();
35583551 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}", .{
35613554 sect.segName(),
35623555 sect.sectName(),
3556 sect.offset,
35633557 new_offset,
3564 new_offset + existing_size,
35653558 });
35663559
35673560 try self.copyRangeAllZeroOut(sect.offset, new_offset, existing_size);