authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-10 09:45:23+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-15 18:49:47+02:00
log322be2698d78836e94b54da959eb28476530b822
tree9357e41fbafd29e32ddc103b5ece69d56272c2a2
parentbb5b82cab9f142bef916e35ec186314a41613356

zld: TextBlock needs to be written to an aligend offset too


1 files changed, 25 insertions(+), 4 deletions(-)

src/link/MachO/Zld.zig+25-4
......@@ -1069,7 +1069,7 @@ fn allocateTextBlocks(self: *Zld) !void {
10691069 assert(sym.payload == .regular);
10701070 sym.payload.regular.address = base_addr;
10711071
1072 log.warn(" {s}: start=0x{x}, end=0x{x}, size={}, align={}", .{
1072 log.warn(" {s}: start=0x{x}, end=0x{x}, size={}, align={}", .{
10731073 sym.name,
10741074 base_addr,
10751075 base_addr + block.size,
......@@ -1103,6 +1103,8 @@ fn allocateTextBlocks(self: *Zld) !void {
11031103}
11041104
11051105fn writeTextBlocks(self: *Zld) !void {
1106 log.warn("writing text blocks", .{});
1107
11061108 var it = self.blocks.iterator();
11071109 while (it.next()) |entry| {
11081110 const match = entry.key_ptr.*;
......@@ -1112,7 +1114,8 @@ fn writeTextBlocks(self: *Zld) !void {
11121114 const sect = seg.sections.items[match.sect];
11131115 const sect_type = sectionType(sect);
11141116
1115 log.warn("writing text blocks for section {s},{s}", .{ segmentName(sect), sectionName(sect) });
1117 log.warn(" for section {s},{s}", .{ segmentName(sect), sectionName(sect) });
1118 log.warn(" {}", .{sect});
11161119
11171120 var code = try self.allocator.alloc(u8, sect.size);
11181121 defer self.allocator.free(code);
......@@ -1126,10 +1129,28 @@ fn writeTextBlocks(self: *Zld) !void {
11261129 var base_off: u64 = sect.size;
11271130
11281131 while (true) {
1129 base_off -= block.size;
1132 const block_alignment = try math.powi(u32, 2, block.alignment);
1133 const unaligned_base_off = base_off - block.size;
1134 const aligned_base_off = mem.alignBackwardGeneric(u64, unaligned_base_off, block_alignment);
1135
1136 const sym = self.locals.items[block.local_sym_index];
1137 log.warn(" {s}: start=0x{x}, end=0x{x}, size={}, align={}", .{
1138 sym.name,
1139 aligned_base_off,
1140 aligned_base_off + block.size,
1141 block.size,
1142 block.alignment,
1143 });
11301144
11311145 try block.resolveRelocs(self);
1132 mem.copy(u8, code[base_off..][0..block.size], block.code);
1146 mem.copy(u8, code[aligned_base_off..][0..block.size], block.code);
1147
1148 // TODO NOP for machine code instead of just zeroing out
1149 const padding_off = aligned_base_off + block.size;
1150 const padding_len = unaligned_base_off - aligned_base_off;
1151 mem.set(u8, code[padding_off..][0..padding_len], 0);
1152
1153 base_off = aligned_base_off;
11331154
11341155 if (block.prev) |prev| {
11351156 block = prev;