aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-03-10 23:45:29 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-03-12 13:16:11 +0100
commitb1eba5a996ed862aefae49a1a7d1480a788095ff (patch)
tree2debf6d50e93317831634489ce135d31d45cae2e /src/link/Elf.zig
parentda5b16f9e2b76534b1cab9093566693482084360 (diff)
downloadzig-b1eba5a996ed862aefae49a1a7d1480a788095ff.tar.gz
zig-b1eba5a996ed862aefae49a1a7d1480a788095ff.zip
elf+aarch64: actually write out thunks, and add a proper link test
Diffstat (limited to 'src/link/Elf.zig')
-rw-r--r--src/link/Elf.zig10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index d26f49ca09..ed6ffbcd08 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -4565,6 +4565,16 @@ fn writeAtoms(self: *Elf) !void {
try self.base.file.?.pwriteAll(buffer, sh_offset);
}
+ for (self.thunks.items) |th| {
+ const shdr = self.shdrs.items[th.output_section_index];
+ const offset = th.value + shdr.sh_offset;
+ const buffer = try gpa.alloc(u8, th.size(self));
+ defer gpa.free(buffer);
+ var stream = std.io.fixedBufferStream(buffer);
+ try th.write(self, stream.writer());
+ try self.base.file.?.pwriteAll(buffer, offset);
+ }
+
try self.reportUndefinedSymbols(&undefs);
if (has_reloc_errors) return error.FlushFailure;