wasm-linker: Fix archive symbols parsing

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.
This commit is contained in:
Luuk de Gram 2022-12-16 18:31:24 +01:00
parent ae106db889
commit 476202eec0
No known key found for this signature in database
GPG Key ID: A8CFE58E4DC7D664
2 changed files with 9 additions and 11 deletions

View File

@ -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);
}
}
}
@ -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 {

View File

@ -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);
@ -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]);
}
}