https://github.com/sbc100 updated 
https://github.com/llvm/llvm-project/pull/206185

>From 4e4b71fc407ee76381a91392fce48cfcfcd42b5f Mon Sep 17 00:00:00 2001
From: Sam Clegg <[email protected]>
Date: Fri, 26 Jun 2026 14:09:33 -0700
Subject: [PATCH] [lld][WebAssembly] Default to -Bdynamic in wasm-ld

Match the behavior of other linkers (like ELF) by defaulting to -Bdynamic.

Previously, wasm-ld defaulted to static linking, requiring explicit
-Bdynamic or -pie/-shared to enable dynamic linking. Now it defaults to
dynamic linking, unless -Bstatic or -r (relocatable) is specified.

Update ReleaseNotes.rst to document this change, and also note that the
experimental warning for PIC/dynamic linking has been removed.
---
 clang/lib/Driver/ToolChains/WebAssembly.cpp | 4 ++++
 clang/test/Driver/wasm-toolchain.c          | 3 ++-
 lld/docs/ReleaseNotes.rst                   | 4 ++++
 lld/test/wasm/libsearch.s                   | 6 +++++-
 lld/wasm/Config.h                           | 5 +----
 lld/wasm/Driver.cpp                         | 6 ++----
 6 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp 
b/clang/lib/Driver/ToolChains/WebAssembly.cpp
index 7dabefbee7f79..f05056435ef11 100644
--- a/clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -121,6 +121,10 @@ void wasm::Linker::ConstructJob(Compilation &C, const 
JobAction &JA,
   if (Args.hasArg(options::OPT_s))
     CmdArgs.push_back("--strip-all");
 
+  // Default to static linking for WASI targets.
+  if (ToolChain.getTriple().isOSWASI())
+    CmdArgs.push_back("-Bstatic");
+
   // On `wasip2` the default linker is `wasm-component-ld` which wraps the
   // execution of `wasm-ld`. Find `wasm-ld` and pass it as an argument of where
   // to find it to avoid it needing to hunt and rediscover or search `PATH` for
diff --git a/clang/test/Driver/wasm-toolchain.c 
b/clang/test/Driver/wasm-toolchain.c
index c02a102fab081..8575b7414e43e 100644
--- a/clang/test/Driver/wasm-toolchain.c
+++ b/clang/test/Driver/wasm-toolchain.c
@@ -18,6 +18,7 @@
 // RUN:   | FileCheck -check-prefix=LINK %s
 // LINK: "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
 // LINK: wasm-ld{{.*}}" "-L/foo/lib" "crt1.o" "[[temp]]" "-lc" 
"{{.*[/\\]}}libclang_rt.builtins.a" "-o" "a.out"
+// LINK-NOT: "-Bstatic"
 
 // A basic C link command-line with optimization with unknown OS.
 
@@ -31,7 +32,7 @@
 // RUN: %clang -### --target=wasm32-wasi --sysroot=/foo %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=LINK_KNOWN %s
 // LINK_KNOWN: "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
-// LINK_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi" "crt1.o" "[[temp]]" 
"-lc" "{{.*[/\\]}}libclang_rt.builtins.a" "-o" "a.out"
+// LINK_KNOWN: wasm-ld{{.*}}" "-m" "wasm32" "-Bstatic" {{.*}} 
"-L/foo/lib/wasm32-wasi" "crt1.o" "[[temp]]" "-lc" 
"{{.*[/\\]}}libclang_rt.builtins.a" "-o" "a.out"
 
 // -shared should be passed through to `wasm-ld` and include crt1-reactor.o 
with a known OS.
 
diff --git a/lld/docs/ReleaseNotes.rst b/lld/docs/ReleaseNotes.rst
index 058173413e41a..38d127f19f754 100644
--- a/lld/docs/ReleaseNotes.rst
+++ b/lld/docs/ReleaseNotes.rst
@@ -84,5 +84,9 @@ MachO Improvements
 WebAssembly Improvements
 ------------------------
 
+* ``wasm-ld`` now defaults to ``-Bdynamic``, matching the behavior of other 
linkers.
+
+* The experimental warning for PIC/dynamic linking has been removed.
+
 Fixes
 #####
diff --git a/lld/test/wasm/libsearch.s b/lld/test/wasm/libsearch.s
index f22d450242136..d8ce4b2ed3d6b 100644
--- a/lld/test/wasm/libsearch.s
+++ b/lld/test/wasm/libsearch.s
@@ -43,8 +43,12 @@
 // DYNAMIC: Symbols [
 // DYNAMIC-NOT: Name: _static
 
-// Should prefer static to dynamic when linking regular executable.
+// Should prefer dynamic to static when linking regular executable (default).
 // RUN: wasm-ld --emit-relocs --no-gc-sections -o %t3 %t.o -L%t.dir -lls
+// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=DYNAMIC %s
+
+// Should prefer static to dynamic when linking regular executable with 
-Bstatic.
+// RUN: wasm-ld --emit-relocs --no-gc-sections -o %t3 %t.o -L%t.dir -Bstatic 
-lls
 // RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=STATIC %s
 
 // Should prefer dynamic when linking PIE.
diff --git a/lld/wasm/Config.h b/lld/wasm/Config.h
index f2f1b895f5b69..1dd54a3034531 100644
--- a/lld/wasm/Config.h
+++ b/lld/wasm/Config.h
@@ -84,10 +84,7 @@ struct Config {
   bool stripAll;
   bool stripDebug;
   bool stackFirst;
-  // Static linking is currently the default under WebAssembly.  This may
-  // change as some point in the future if dynamic linking becomes more widely
-  // used.
-  bool isStatic = true;
+  bool isStatic = false;
   bool thinLTOEmitImportsFiles;
   bool thinLTOEmitIndexFiles;
   bool thinLTOIndexOnly;
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 9a2e3a82a9279..f7150b38f2502 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -578,6 +578,8 @@ static void readConfigs(opt::InputArgList &args) {
   ctx.arg.optimize = args::getInteger(args, OPT_O, 1);
   ctx.arg.outputFile = args.getLastArgValue(OPT_o);
   ctx.arg.relocatable = args.hasArg(OPT_relocatable);
+  if (ctx.arg.relocatable)
+    ctx.arg.isStatic = true;
   ctx.arg.rpath = args::getStrings(args, OPT_rpath);
   ctx.arg.gcSections =
       args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, !ctx.arg.relocatable);
@@ -643,10 +645,6 @@ static void readConfigs(opt::InputArgList &args) {
   if (ctx.arg.pageSize != 1 && ctx.arg.pageSize != WasmDefaultPageSize)
     error("--page_size=N must be either 1 or 65536");
 
-  // -Bdynamic by default if -pie or -shared is specified.
-  if (ctx.arg.pie || ctx.arg.shared)
-    ctx.arg.isStatic = false;
-
   if (ctx.arg.maxMemory != 0 && ctx.arg.noGrowableMemory) {
     // Erroring out here is simpler than defining precedence rules.
     error("--max-memory is incompatible with --no-growable-memory");

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to