| ... | ... | @@ -1769,11 +1769,16 @@ fn writeAtoms(self: *MachO) !void { |
| 1769 | 1769 | const match = entry.key_ptr.*; |
| 1770 | 1770 | var atom: *TextBlock = entry.value_ptr.*; |
| 1771 | 1771 | |
| 1772 | | while (atom.prev) |prev| { |
| 1773 | | try self.writeAtom(atom, match); |
| 1774 | | atom = prev; |
| 1772 | while (true) { |
| 1773 | if (atom.dirty) { |
| 1774 | try self.writeAtom(atom, match); |
| 1775 | atom.dirty = false; |
| 1776 | } |
| 1777 | |
| 1778 | if (atom.prev) |prev| { |
| 1779 | atom = prev; |
| 1780 | } else break; |
| 1775 | 1781 | } |
| 1776 | | try self.writeAtom(atom, match); |
| 1777 | 1782 | } |
| 1778 | 1783 | } |
| 1779 | 1784 | |
| ... | ... | @@ -2609,8 +2614,9 @@ fn parseTextBlocks(self: *MachO) !void { |
| 2609 | 2614 | .alignment = 0, |
| 2610 | 2615 | }; |
| 2611 | 2616 | } |
| 2617 | const size = padToIdeal(sect.size); |
| 2612 | 2618 | const alignment = try math.powi(u32, 2, sect.@"align"); |
| 2613 | | res.value_ptr.size += mem.alignForwardGeneric(u64, sect.size, alignment); |
| 2619 | res.value_ptr.size += mem.alignForwardGeneric(u64, size, alignment); |
| 2614 | 2620 | res.value_ptr.alignment = math.max(res.value_ptr.alignment, sect.@"align"); |
| 2615 | 2621 | } |
| 2616 | 2622 | } |
| ... | ... | @@ -2633,6 +2639,49 @@ fn parseTextBlocks(self: *MachO) !void { |
| 2633 | 2639 | for (self.objects.items) |*object, object_id| { |
| 2634 | 2640 | try object.parseTextBlocks(self.base.allocator, @intCast(u16, object_id), self); |
| 2635 | 2641 | } |
| 2642 | |
| 2643 | // it = section_metadata.iterator(); |
| 2644 | // while (it.next()) |entry| { |
| 2645 | // const match = entry.key_ptr.*; |
| 2646 | // const metadata = entry.value_ptr.*; |
| 2647 | // const seg = self.load_commands.items[match.seg].Segment; |
| 2648 | // const sect = seg.sections.items[match.sect]; |
| 2649 | |
| 2650 | // var buffer = try self.base.allocator.alloc(u8, metadata.size); |
| 2651 | // defer self.base.allocator.free(buffer); |
| 2652 | // log.warn("{s},{s} buffer size 0x{x}", .{ |
| 2653 | // commands.segmentName(sect), |
| 2654 | // commands.sectionName(sect), |
| 2655 | // metadata.size, |
| 2656 | // }); |
| 2657 | |
| 2658 | // var atom = self.blocks.get(match).?; |
| 2659 | |
| 2660 | // while (atom.prev) |prev| { |
| 2661 | // atom = prev; |
| 2662 | // } |
| 2663 | |
| 2664 | // const base = blk: { |
| 2665 | // const sym = self.locals.items[atom.local_sym_index]; |
| 2666 | // break :blk sym.n_value; |
| 2667 | // }; |
| 2668 | |
| 2669 | // while (true) { |
| 2670 | // const sym = self.locals.items[atom.local_sym_index]; |
| 2671 | // const offset = sym.n_value - base; |
| 2672 | // try atom.resolveRelocs(self); |
| 2673 | // log.warn("writing atom for symbol {s} at buffer offset 0x{x}", .{ |
| 2674 | // self.getString(sym.n_strx), |
| 2675 | // offset, |
| 2676 | // }); |
| 2677 | // mem.copy(u8, buffer[offset..][0..atom.code.items.len], atom.code.items); |
| 2678 | // atom.dirty = false; |
| 2679 | |
| 2680 | // if (atom.next) |next| { |
| 2681 | // atom = next; |
| 2682 | // } else break; |
| 2683 | // } |
| 2684 | // } |
| 2636 | 2685 | } |
| 2637 | 2686 | |
| 2638 | 2687 | fn addDataInCodeLC(self: *MachO) !void { |
| ... | ... | @@ -3836,6 +3885,7 @@ fn growSection(self: *MachO, match: MatchingSection, new_size: u32) !void { |
| 3836 | 3885 | const needed_size = mem.alignForwardGeneric(u32, ideal_size, alignment); |
| 3837 | 3886 | |
| 3838 | 3887 | if (needed_size > max_size) blk: { |
| 3888 | log.debug(" (need to grow!)", .{}); |
| 3839 | 3889 | // Need to move all sections below in file and address spaces. |
| 3840 | 3890 | const offset_amt = offset: { |
| 3841 | 3891 | const max_alignment = try self.getSectionMaxAlignment(match.seg, match.sect + 1); |