aboutsummaryrefslogtreecommitdiff
path: root/src/link/Wasm/Atom.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-09-01 22:02:24 +0200
committerLuuk de Gram <luuk@degram.dev>2022-09-07 18:53:16 +0200
commit46c932a2c9650f14ae8035d7382d825bfabdc0a5 (patch)
treee819d6b20acb736af12a5b7f35ce4c34e17f3600 /src/link/Wasm/Atom.zig
parentc347751338a4a1e2874207674fb47908fd601484 (diff)
downloadzig-46c932a2c9650f14ae8035d7382d825bfabdc0a5.tar.gz
zig-46c932a2c9650f14ae8035d7382d825bfabdc0a5.zip
wasm-linker: perform debug relocations
This correctly performs a relocation for debug sections. The result is that the wasm-linker can now correctly create a binary from object files while preserving all debug information.
Diffstat (limited to 'src/link/Wasm/Atom.zig')
-rw-r--r--src/link/Wasm/Atom.zig7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/link/Wasm/Atom.zig b/src/link/Wasm/Atom.zig
index 9e7f7a5a76..64efa8320f 100644
--- a/src/link/Wasm/Atom.zig
+++ b/src/link/Wasm/Atom.zig
@@ -145,7 +145,7 @@ pub fn resolveRelocs(self: *Atom, wasm_bin: *const Wasm) void {
/// All values will be represented as a `u64` as all values can fit within it.
/// The final value must be casted to the correct size.
fn relocationValue(self: Atom, relocation: types.Relocation, wasm_bin: *const Wasm) u64 {
- const target_loc: Wasm.SymbolLoc = .{ .file = self.file, .index = relocation.index };
+ const target_loc = (Wasm.SymbolLoc{ .file = self.file, .index = relocation.index }).finalLoc(wasm_bin);
const symbol = target_loc.getSymbol(wasm_bin).*;
switch (relocation.relocation_type) {
.R_WASM_FUNCTION_INDEX_LEB => return symbol.index,
@@ -174,8 +174,7 @@ fn relocationValue(self: Atom, relocation: types.Relocation, wasm_bin: *const Wa
=> {
std.debug.assert(symbol.tag == .data and !symbol.isUndefined());
const merge_segment = wasm_bin.base.options.output_mode != .Obj;
- const target_atom_loc = wasm_bin.discarded.get(target_loc) orelse target_loc;
- const target_atom = wasm_bin.symbol_atom.get(target_atom_loc).?;
+ const target_atom = wasm_bin.symbol_atom.get(target_loc).?;
const segment_info = if (target_atom.file) |object_index| blk: {
break :blk wasm_bin.objects.items[object_index].segment_info;
} else wasm_bin.segment_info.items;
@@ -187,6 +186,6 @@ fn relocationValue(self: Atom, relocation: types.Relocation, wasm_bin: *const Wa
.R_WASM_EVENT_INDEX_LEB => return symbol.index,
.R_WASM_SECTION_OFFSET_I32,
.R_WASM_FUNCTION_OFFSET_I32,
- => return relocation.offset,
+ => return relocation.addend orelse 0,
}
}