diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-06-07 08:37:04 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-06-09 01:25:38 +0200 |
| commit | 93a4403271ef62d8ae2cd10f58cc23d4b7bbdf4d (patch) | |
| tree | cffa7232a2e239a72e38648613768b0c3c5aedde /src/link/Wasm.zig | |
| parent | 6f6182a5f3a4b027bbff6405600fd21b3ef8b86c (diff) | |
| download | zig-93a4403271ef62d8ae2cd10f58cc23d4b7bbdf4d.tar.gz zig-93a4403271ef62d8ae2cd10f58cc23d4b7bbdf4d.zip | |
cc,wasi: package emulations as static archives
This replicates the expected behavior when using `clang` with
upstream `wasi-libc` sysroot: linking emulated subcomponents
such as process clocks or signals requires an explicit link flag
in the compiler invocation, for example:
```
zig cc -target wasm32-wasi -lwasi-emulated-process-clocks main.c -o main.wasm
```
Diffstat (limited to 'src/link/Wasm.zig')
| -rw-r--r-- | src/link/Wasm.zig | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 77283384be..443ace855a 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -702,11 +702,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { try argv.append(try comp.get_libc_crt_file(arena, "crt.o")); } - if (!is_obj and self.base.options.link_libc) { - try argv.append(try comp.get_libc_crt_file(arena, switch (self.base.options.link_mode) { - .Static => "libc.a", - .Dynamic => unreachable, - })); + if (!is_obj) { + const system_libs = self.base.options.system_libs.keys(); + for (system_libs) |link_lib| { + const full_name = try std.fmt.allocPrint(arena, "lib{s}.a", .{link_lib}); + if (comp.crt_files.get(full_name)) |crt| { + try argv.append(crt.full_object_path); + } else { + 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")); + } } // Positional arguments to the linker such as object files. |
