Skip to content

Commit

Permalink
wasm-linker: Fix archive symbols parsing
Browse files Browse the repository at this point in the history
When parsing the table of contents containing the symbols and their
positions we initially used the index within the map to retrieve
the offset. However, during resizing of the underlaying array this
would invalidate those indexes which meant incorrect offsets were
being stored for symbols. We now use the current symbol index
to also get the index into the symbol position instead.
  • Loading branch information
Luukdegram committed Dec 16, 2022
1 parent ae106db commit 476202e
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 11 deletions.
5 changes: 2 additions & 3 deletions src/link/Wasm.zig
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,7 @@ fn resolveSymbolsInObject(wasm: *Wasm, object_index: u16) !void {
try wasm.resolved_symbols.put(wasm.base.allocator, location, {});
assert(wasm.resolved_symbols.swapRemove(existing_loc));
if (existing_sym.isUndefined()) {
assert(wasm.undefs.swapRemove(sym_name));
_ = wasm.undefs.swapRemove(sym_name);
}
}
}
Expand All @@ -636,8 +636,7 @@ fn resolveSymbolsInArchives(wasm: *Wasm) !void {
log.debug("Resolving symbols in archives", .{});
var index: u32 = 0;
undef_loop: while (index < wasm.undefs.count()) {
const undef_sym_loc = wasm.undefs.values()[index];
const sym_name = undef_sym_loc.getName(wasm);
const sym_name = wasm.undefs.keys()[index];

for (wasm.archives.items) |archive| {
const offset = archive.toc.get(sym_name) orelse {
Expand Down
15 changes: 7 additions & 8 deletions src/link/Wasm/Archive.zig
Original file line number Diff line number Diff line change
Expand Up @@ -157,13 +157,12 @@ fn parseTableOfContents(archive: *Archive, allocator: Allocator, reader: anytype
};

var i: usize = 0;
while (i < sym_tab.len) {
const string = mem.sliceTo(sym_tab[i..], 0);
if (string.len == 0) {
i += 1;
continue;
}
i += string.len;
var pos: usize = 0;
while (i < num_symbols) : (i += 1) {
const string = mem.sliceTo(sym_tab[pos..], 0);
pos += string.len + 1;
if (string.len == 0) continue;

const name = try allocator.dupe(u8, string);
errdefer allocator.free(name);
const gop = try archive.toc.getOrPut(allocator, name);
Expand All @@ -172,7 +171,7 @@ fn parseTableOfContents(archive: *Archive, allocator: Allocator, reader: anytype
} else {
gop.value_ptr.* = .{};
}
try gop.value_ptr.append(allocator, symbol_positions[gop.index]);
try gop.value_ptr.append(allocator, symbol_positions[i]);
}
}

Expand Down

0 comments on commit 476202e

Please sign in to comment.