diff --git a/lld/test/wasm/pie.ll b/lld/test/wasm/pie.ll --- a/lld/test/wasm/pie.ll +++ b/lld/test/wasm/pie.ll @@ -1,5 +1,5 @@ ; RUN: llc -relocation-model=pic -mattr=+mutable-globals -filetype=obj %s -o %t.o -; RUN: wasm-ld --no-gc-sections --allow-undefined --experimental-pic -pie -o %t.wasm %t.o +; RUN: wasm-ld --no-gc-sections --experimental-pic -pie -o %t.wasm %t.o target triple = "wasm32-unknown-emscripten" @@ -26,9 +26,12 @@ } define void @_start() { + call void @external_func() ret void } +declare void @external_func() + ; CHECK: Sections: ; CHECK-NEXT: - Type: CUSTOM ; CHECK-NEXT: Name: dylink @@ -88,27 +91,29 @@ ; RUN: obj2yaml %t.shmem.wasm | FileCheck %s --check-prefix=SHMEM ; SHMEM: - Type: CODE -; SHMEM: - Index: 5 +; SHMEM: - Index: 6 ; SHMEM-NEXT: Locals: [] -; SHMEM-NEXT: Body: 100210040B +; SHMEM-NEXT: Body: 100310050B ; SHMEM: FunctionNames: ; SHMEM-NEXT: - Index: 0 -; SHMEM-NEXT: Name: __wasm_call_ctors +; SHMEM-NEXT: Name: external_func ; SHMEM-NEXT: - Index: 1 -; SHMEM-NEXT: Name: __wasm_init_tls +; SHMEM-NEXT: Name: __wasm_call_ctors ; SHMEM-NEXT: - Index: 2 -; SHMEM-NEXT: Name: __wasm_init_memory +; SHMEM-NEXT: Name: __wasm_init_tls ; SHMEM-NEXT: - Index: 3 -; SHMEM-NEXT: Name: __wasm_apply_data_relocs +; SHMEM-NEXT: Name: __wasm_init_memory ; SHMEM-NEXT: - Index: 4 -; SHMEM-NEXT: Name: __wasm_apply_global_relocs +; SHMEM-NEXT: Name: __wasm_apply_data_relocs ; SHMEM-NEXT: - Index: 5 -; SHMEM-NEXT: Name: __wasm_start +; SHMEM-NEXT: Name: __wasm_apply_global_relocs ; SHMEM-NEXT: - Index: 6 -; SHMEM-NEXT: Name: foo +; SHMEM-NEXT: Name: __wasm_start ; SHMEM-NEXT: - Index: 7 -; SHMEM-NEXT: Name: get_data_address +; SHMEM-NEXT: Name: foo ; SHMEM-NEXT: - Index: 8 +; SHMEM-NEXT: Name: get_data_address +; SHMEM-NEXT: - Index: 9 ; SHMEM-NEXT: Name: _start diff --git a/lld/wasm/Relocations.cpp b/lld/wasm/Relocations.cpp --- a/lld/wasm/Relocations.cpp +++ b/lld/wasm/Relocations.cpp @@ -150,10 +150,9 @@ addGOTEntry(sym); break; } - } else { + } else if (sym->isUndefined() && !config->relocatable && !sym->isWeak()) { // Report undefined symbols - if (sym->isUndefined() && !config->relocatable && !sym->isWeak()) - reportUndefined(sym); + reportUndefined(sym); } } } diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -560,7 +560,7 @@ if (isa(sym)) return false; - if (config->relocatable || + if ((config->isPic || config->relocatable) || config->unresolvedSymbols == UnresolvedPolicy::ImportFuncs) return true; if (config->allowUndefinedSymbols.count(sym->getName()) != 0)