zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 58618afaee7c14feedad4f115e9a4468bac4c529 (tree)
parent 1cb7a01b25349c42dbe207b68f9e19b92890b3d2
Author: Luuk de Gram <luuk@degram.dev>
Date:   Thu, 31 Aug 2023 17:12:12 +0200

wasm-linker: correctly pass --shared and --pie

When linking a WebAssembly binary using wasm-ld, we will now correctly pass
--shared when building a dynamic library and --pie when `-fpic` is given.
This is a breaking change and users who currently build dynamic libraries
for WebAssembly but wish to have an executable without a main, should use
build-exe instead while supplying `-fno-entry`.

We also verify the user does not supply --export-memory when -dynamic is
enabled. By default we set this flag now to 'false' when `-dynamic` is used
to ensure we do not enable it as it's enabled by default for regular
WebAssembly binaries.

Diffstat:
Msrc/link/Wasm.zig | 7+++++++
Msrc/main.zig | 10++++++++++
2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig @@ -4548,6 +4548,13 @@ fn linkWithLLD(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) ! try argv.append("--no-entry"); } + if (wasm.base.options.output_mode == .Lib and wasm.base.options.link_mode == .Dynamic) { + try argv.append("--shared"); + } + if (wasm.base.options.pie) { + try argv.append("--pie"); + } + // XXX - TODO: add when wasm-ld supports --build-id. // if (wasm.base.options.build_id) { // try argv.append("--build-id=tree"); diff --git a/src/main.zig b/src/main.zig @@ -2627,6 +2627,16 @@ fn buildOutputType( if (single_threaded == null) { single_threaded = true; } + if (link_mode) |mode| { + if (mode == .Dynamic) { + if (linker_export_memory != null and linker_export_memory.?) { + fatal("flags '-dynamic' and '--export-memory' are incompatible", .{}); + } + // User did not supply `--export-memory` which is incompatible with -dynamic, therefore + // set the flag to false to ensure it does not get enabled by default. + linker_export_memory = false; + } + } if (wasi_exec_model) |model| { if (model == .reactor) { if (linker_no_entry != null and !linker_no_entry.?) {