Skip to content

Commit

Permalink
[lld][WebAssembly] Work around limited architecture detection for was…
Browse files Browse the repository at this point in the history
…m64 shared libraries (#98961)

We don't currently have a great way to detect the architecture of shared
object files under wasm. The currently method involves checking if the
imported or exported memory is 64-bit. However some shared libraries
don't use linear memory at all.

See #98778
  • Loading branch information
sbc100 authored Jul 16, 2024
1 parent 80e18b9 commit ad2ff17
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
10 changes: 10 additions & 0 deletions lld/test/wasm/dylink.s
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
# RUN: wasm-ld --experimental-pic -pie -o %t.wasm %t.o %t.lib.so
# RUN: obj2yaml %t.wasm | FileCheck %s

# Same again for wasm64

# RUN: llvm-mc -filetype=obj -triple=wasm64-unknown-emscripten -o %t.o %s
# RUN: llvm-mc -filetype=obj -triple=wasm64-unknown-emscripten %p/Inputs/ret32.s -o %t.ret32.o
# RUN: llvm-mc -filetype=obj -triple=wasm64-unknown-emscripten %p/Inputs/libsearch-dyn.s -o %t.dyn.o
# RUN: wasm-ld --experimental-pic -mwasm64 -shared %t.ret32.o %t.dyn.o -o %t.lib.so
# RUN: not wasm-ld --experimental-pic -mwasm64 -pie -o %t.wasm %t.o 2>&1 | FileCheck --check-prefix=ERROR %s
# RUN: wasm-ld --experimental-pic -mwasm64 -pie -o %t.wasm %t.o %t.lib.so
# RUN: obj2yaml %t.wasm | FileCheck %s

# ERROR: error: {{.*}}: undefined symbol: ret32
# ERROR: error: {{.*}}: undefined symbol: _bar
.functype ret32 (f32) -> (i32)
Expand Down
8 changes: 6 additions & 2 deletions lld/wasm/InputFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,12 @@ ObjFile::ObjFile(MemoryBufferRef m, StringRef archiveName, bool lazy)
this->lazy = lazy;
this->archiveName = std::string(archiveName);

// Currently we only do this check for regular object file, and not for shared
// object files. This is because architecture detection for shared objects is
// currently based on a heuristic, which is fallable:
// https://github.com/llvm/llvm-project/issues/98778
checkArch(wasmObj->getArch());

// If this isn't part of an archive, it's eagerly linked, so mark it live.
if (archiveName.empty())
markLive();
Expand Down Expand Up @@ -456,8 +462,6 @@ WasmFileBase::WasmFileBase(Kind k, MemoryBufferRef m) : InputFile(k, m) {

bin.release();
wasmObj.reset(obj);

checkArch(obj->getArch());
}

void ObjFile::parse(bool ignoreComdats) {
Expand Down

0 comments on commit ad2ff17

Please sign in to comment.