This adds support for Emscripten-style shared libraries [1] to the wasm32-wasi
target. Previously, only static linking was supported, and the -shared and
-fPIC flags were simply ignored. Now both flags are honored.
Since WASI runtimes do not necessarily include JavaScript support, we cannot
rely on the JS-based Emscripten linker to link shared libraries. Instead, we
link them using the Component Model proposal [2].
We have prototyped shared library support in wasi-sdk [3] and put together a
demo [4] which uses a patched version of wit-component [5] to link libraries
using the Component Model. We plan to submit the required changes upstream to
the respective repositories in the next week or two.
[1] https://github.com/WebAssembly/tool-conventions/blob/main/DynamicLinking.md
[2] https://github.com/WebAssembly/component-model/blob/main/design/mvp/examples/SharedEverythingDynamicLinking.md
[3] https://github.com/dicej/wasi-sdk/tree/dynamic-linking
[4] https://github.com/dicej/component-linking-demo
[5] https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component
Signed-off-by: Joel Dice <joel.dice@fermyon.com>
Would it not make more sense to simply say that all WebAssembly targets now support shared libraries and PIC code generation? Perhaps we could phrase it something like this:
"Shared library support (and PIC code generation) for is no longer limited to the Emscripten target OS and now works with other targets such as wasm32-wasi."