diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-01-13 17:34:09 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-01-15 15:11:36 -0800 |
| commit | cde84c8795e8da13512098c8b19f17217e691dde (patch) | |
| tree | 2d700b667d20cdb9751eb6a7264d4ecf61c75080 /src | |
| parent | dd9a64721030cf10065e74755f0c757cb470bcf3 (diff) | |
| download | zig-cde84c8795e8da13512098c8b19f17217e691dde.tar.gz zig-cde84c8795e8da13512098c8b19f17217e691dde.zip | |
wasm linker: fix missed addend for uav and nav fixups
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.zig | 2 | ||||
| -rw-r--r-- | src/link/Wasm.zig | 2 | ||||
| -rw-r--r-- | src/link/Wasm/Flush.zig | 4 |
3 files changed, 6 insertions, 2 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 0040e9c921..f4b524c872 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -677,6 +677,7 @@ fn lowerUavRef( wasm.uav_fixups.appendAssumeCapacity(.{ .uavs_exe_index = try wasm.refUavExe(uav.val), .offset = @intCast(code.items.len), + .addend = @intCast(offset), }); } code.appendNTimesAssumeCapacity(0, ptr_width_bytes); @@ -761,6 +762,7 @@ fn lowerNavRef( wasm.nav_fixups.appendAssumeCapacity(.{ .navs_exe_index = try wasm.refNavExe(nav_index), .offset = @intCast(code.items.len), + .addend = @intCast(offset), }); } } diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 4b130fce00..517a9002f1 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -312,12 +312,14 @@ pub const UavFixup = extern struct { uavs_exe_index: UavsExeIndex, /// Index into `string_bytes`. offset: u32, + addend: u32, }; pub const NavFixup = extern struct { navs_exe_index: NavsExeIndex, /// Index into `string_bytes`. offset: u32, + addend: u32, }; pub const FuncTableFixup = extern struct { diff --git a/src/link/Wasm/Flush.zig b/src/link/Wasm/Flush.zig index 5a7fbc091b..b6627bff07 100644 --- a/src/link/Wasm/Flush.zig +++ b/src/link/Wasm/Flush.zig @@ -796,7 +796,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { if (!is_obj) { for (wasm.uav_fixups.items) |uav_fixup| { const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .uav_exe = uav_fixup.uavs_exe_index }); - const vaddr = f.data_segments.get(ds_id).?; + const vaddr = f.data_segments.get(ds_id).? + uav_fixup.addend; if (!is64) { mem.writeInt(u32, wasm.string_bytes.items[uav_fixup.offset..][0..4], vaddr, .little); } else { @@ -805,7 +805,7 @@ pub fn finish(f: *Flush, wasm: *Wasm) !void { } for (wasm.nav_fixups.items) |nav_fixup| { const ds_id: Wasm.DataSegmentId = .pack(wasm, .{ .nav_exe = nav_fixup.navs_exe_index }); - const vaddr = f.data_segments.get(ds_id).?; + const vaddr = f.data_segments.get(ds_id).? + nav_fixup.addend; if (!is64) { mem.writeInt(u32, wasm.string_bytes.items[nav_fixup.offset..][0..4], vaddr, .little); } else { |
