diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-06-07 17:03:29 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-06-09 01:25:38 +0200 |
| commit | dd84ccda5daf63373b2b5df3ac02025017b7efbf (patch) | |
| tree | c85dbd8048ffdac85962d4e8ac83f94ce2b94cc0 /src | |
| parent | 95745f77da6cd3ca30aea6aa47253c1e0a4f5a75 (diff) | |
| download | zig-dd84ccda5daf63373b2b5df3ac02025017b7efbf.tar.gz zig-dd84ccda5daf63373b2b5df3ac02025017b7efbf.zip | |
wasi: clean up linking logic
Do not try to link WASI libc or emulated subcomponents when not
targeting WASI; e.g., when targeting `wasm32-freestanding`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Wasm.zig | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 0168028354..39f1f13e60 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -574,7 +574,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { null; const target = self.base.options.target; - const link_in_crt = self.base.options.link_libc and self.base.options.output_mode == .Exe; const id_symlink_basename = "lld.id"; @@ -653,8 +652,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { try fs.cwd().copyFile(the_object_path, fs.cwd(), full_out_path, .{}); } } else { - const is_obj = self.base.options.output_mode == .Obj; - // Create an LLD command line and invoke it. var argv = std.ArrayList([]const u8).init(self.base.allocator); defer argv.deinit(); @@ -662,10 +659,6 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { // This is necessary because LLD does not behave properly as a library - // it calls exit() and does not reset all global data between invocations. try argv.appendSlice(&[_][]const u8{ comp.self_exe_path.?, "wasm-ld" }); - if (is_obj) { - try argv.append("-r"); - } - try argv.append("-error-limit=0"); if (self.base.options.lto) { @@ -697,25 +690,29 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { full_out_path, }); - if (link_in_crt) { - // TODO work out if we want standard crt, a reactor or a command - try argv.append(try comp.get_libc_crt_file(arena, "crt1.o")); - } - - if (!is_obj) { - const system_libs = self.base.options.system_libs.keys(); - for (system_libs) |link_lib| { - try argv.append(try std.fmt.allocPrint(arena, "-l{s}", .{link_lib})); + if (target.os.tag == .wasi) { + if (self.base.options.link_libc and self.base.options.output_mode == .Exe) { + // TODO work out if we want standard crt, a reactor or a command + try argv.append(try comp.get_libc_crt_file(arena, "crt1.o")); } - const wasi_emulated_libs = self.base.options.wasi_emulated_libs; - for (wasi_emulated_libs) |lib_name| { - const full_lib_name = try std.fmt.allocPrint(arena, "lib{s}.a", .{lib_name}); - try argv.append(try comp.get_libc_crt_file(arena, full_lib_name)); - } + const is_exe_or_dyn_lib = self.base.options.output_mode == .Exe or + (self.base.options.output_mode == .Lib and self.base.options.link_mode == .Dynamic); + if (is_exe_or_dyn_lib) { + const system_libs = self.base.options.system_libs.keys(); + for (system_libs) |link_lib| { + try argv.append(try std.fmt.allocPrint(arena, "-l{s}", .{link_lib})); + } - if (self.base.options.link_libc) { - try argv.append(try comp.get_libc_crt_file(arena, "libc.a")); + const wasi_emulated_libs = self.base.options.wasi_emulated_libs; + for (wasi_emulated_libs) |lib_name| { + const full_lib_name = try std.fmt.allocPrint(arena, "lib{s}.a", .{lib_name}); + try argv.append(try comp.get_libc_crt_file(arena, full_lib_name)); + } + + if (self.base.options.link_libc) { + try argv.append(try comp.get_libc_crt_file(arena, "libc.a")); + } } } |
