authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-06-09 22:21:58+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-06-10 06:36:16+02:00
logb82d6422ac5c0a68b812319f689b66b52b0eaf59
tree77d72cbf28a637f523ac27ccbc0a2499a75a501a
parente8e305b67ce4993a3789e0e3e8baa6064de45114

link: don't link system libs by the wasm linker

The only allowed system libraries that we can link are libraries that are part of the sysroot such as libc or WASI emulated subcomponents. This is required as Wasm allows to defer symbol resolution until load time. For example, the following import in Zig ```zig extern "wasi_snapshot_preview1" fn proc_exit() void; ``` would normally result in appending `-lwasi_snapshot_preview1` flag to the linker line. However, for Wasm/WASI, the symbol is provided at load rather than link time, therefore, the linker should not be concerned with resolving the symbol. As a result, we should not consider system libs by the Wasm linker.

1 files changed, 0 insertions(+), 11 deletions(-)

src/link/Wasm.zig-11
......@@ -701,17 +701,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
701701 const is_exe_or_dyn_lib = self.base.options.output_mode == .Exe or
702702 (self.base.options.output_mode == .Lib and self.base.options.link_mode == .Dynamic);
703703 if (is_exe_or_dyn_lib) {
704 const system_libs = self.base.options.system_libs.keys();
705
706 for (system_libs) |link_lib| {
707 if (mem.eql(u8, "wasi_snapshot_preview1", link_lib)) {
708 // Any referenced symbol from this lib, will be undefined until
709 // runtime as this lib is provided directly by the runtime.
710 continue;
711 }
712 try argv.append(try std.fmt.allocPrint(arena, "-l{s}", .{link_lib}));
713 }
714
715704 const wasi_emulated_libs = self.base.options.wasi_emulated_libs;
716705 for (wasi_emulated_libs) |crt_file| {
717706 try argv.append(try comp.get_libc_crt_file(