aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
Diffstat (limited to 'lld')
-rw-r--r--lld/test/wasm/lto/relocation-model.ll5
-rw-r--r--lld/wasm/LTO.cpp6
2 files changed, 11 insertions, 0 deletions
diff --git a/lld/test/wasm/lto/relocation-model.ll b/lld/test/wasm/lto/relocation-model.ll
index 8fe198d..a042615 100644
--- a/lld/test/wasm/lto/relocation-model.ll
+++ b/lld/test/wasm/lto/relocation-model.ll
@@ -8,6 +8,11 @@
; RUN: wasm-ld %t.o -o %t_static.wasm -save-temps -r -mllvm -relocation-model=static
; RUN: llvm-readobj -r %t_static.wasm.lto.o | FileCheck %s --check-prefix=STATIC
+;; Linking with --unresolved-symbols=import-dynamic should also generate PIC
+;; code for external references.
+; RUN: wasm-ld %t.o -o %t_import.wasm -save-temps --experimental-pic --unresolved-symbols=import-dynamic
+; RUN: llvm-readobj -r %t_import.wasm.lto.o | FileCheck %s --check-prefix=PIC
+
; PIC: R_WASM_GLOBAL_INDEX_LEB foo
; STATIC: R_WASM_MEMORY_ADDR_LEB foo
diff --git a/lld/wasm/LTO.cpp b/lld/wasm/LTO.cpp
index ae85f46..668cdf2 100644
--- a/lld/wasm/LTO.cpp
+++ b/lld/wasm/LTO.cpp
@@ -63,6 +63,12 @@ static lto::Config createConfig() {
c.RelocModel = std::nullopt;
else if (ctx.isPic)
c.RelocModel = Reloc::PIC_;
+ else if (ctx.arg.unresolvedSymbols == UnresolvedPolicy::ImportDynamic)
+ // With ImportDynamic we also need to use the PIC relocation model so that
+ // external symbols are references via the GOT.
+ // TODO(sbc): This should probably be Reloc::DynamicNoPIC, but the backend
+ // doesn't currently support that.
+ c.RelocModel = Reloc::PIC_;
else
c.RelocModel = Reloc::Static;