mirror of
https://github.com/ziglang/zig.git
synced 2026-02-09 11:03:30 +00:00
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:
parent
ae106db889
commit
476202eec0
@ -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 {
|
||||
|
||||
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user