aboutsummaryrefslogtreecommitdiff
path: root/src/link/Wasm.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-06-07 08:37:04 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-06-09 01:25:38 +0200
commit93a4403271ef62d8ae2cd10f58cc23d4b7bbdf4d (patch)
treecffa7232a2e239a72e38648613768b0c3c5aedde /src/link/Wasm.zig
parent6f6182a5f3a4b027bbff6405600fd21b3ef8b86c (diff)
downloadzig-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.zig19
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.