Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* add shared library support This adds support for building WASI shared libraries per https://github.com/WebAssembly/tool-conventions/blob/main/DynamicLinking.md. For the time being, the goal is to allow "pseudo-dynamic" linking using the Component Model per https://github.com/WebAssembly/component-model/blob/main/design/mvp/examples/SharedEverythingDynamicLinking.md. This requires all libraries to be available when the component is created, but still allows runtime symbol resolution via `dlopen`/`dlsym` backed by a static lookup table. This is sufficient to support Python native extensions, for example. A complete demo using `wit-component` is available at https://github.com/dicej/component-linking-demo. This commit adds support for building `libc.so`, `libc++.so`, and `libc++abi.so` alongside their static counterparts. Notes: - I had to refactor `errno` support a bit to avoid a spurious `_ZTH5errno` (AKA "thread-local initialization routine for errno") import in `libc++.so`. - Long double print and scan are included by default in `libc.so` rather than in a separate library. - `__main_argc_argv` is now a weak symbol since it's not relevant for reactors. - `dlopen`/`dlsym` rely on a lookup table provided by the "dynamic" linker via `__wasm_set_libraries`. Not all flags are supported yet, and unrecognized flags will result in an error. - This requires https://reviews.llvm.org/D153293, which we will need to backport to LLVM 16 until 17 is released. I'll open a `wasi-sdk` PR with that change and various Makefile tweaks to support shared libraries. - `libc.so` is temporarily disabled for the `wasi-threads` build until someone can make `wasi_thread_start.s` position-independent. Signed-off-by: Joel Dice <[email protected]> build `-fPIC` .o files separately from non-`-fPIC` ones This allows us to build both libc.so and libc.a without incurring indirection penalties in the latter. Signed-off-by: Joel Dice <[email protected]> only build libc.so when explicitly requested Shared library support in LLVM for non-Emscripten Wasm targets will be added in version 17, which has not yet been released, so we should not attempt to build libc.so by default (at least not yet). Signed-off-by: Joel Dice <[email protected]> remove dl.c I'll open a separate PR for this later. Signed-off-by: Joel Dice <[email protected]> update `check-symbols` files Signed-off-by: Joel Dice <[email protected]> * generate separate .so files for emulated features Signed-off-by: Joel Dice <[email protected]> * revert errno changes in favor of a smaller change @yamt pointed out there's an easier way to address the `_ZTH5errno` issue I described in an earlier commit: use `_Thread_local` for both C and C++. This gives us a simpler ABI and avoids needing to import a thread-local initializer for `errno` in libc++.so. Signed-off-by: Joel Dice <[email protected]> * remove redundant `$(OBJDIR)/%.long-double.pic.o` rule in Makefile Signed-off-by: Joel Dice <[email protected]> * consolidate libwasi-emulated-*.so into a single library Signed-off-by: Joel Dice <[email protected]> * add comment explaining use of `--whole-archive` Signed-off-by: Joel Dice <[email protected]> * Revert "remove redundant `$(OBJDIR)/%.long-double.pic.o` rule in Makefile" This reverts commit dbe2cb1. * move `__main_void` from __main_void.c to crt1-command.c This and `__main_argc_argv` are only relevant for commands (not reactors), so it makes sense to scope them accordingly. In addition, the latter was being imported from libc.so, forcing applications to provide it even if it wasn't relevant. Signed-off-by: Joel Dice <[email protected]> * Revert "consolidate libwasi-emulated-*.so into a single library" This reverts commit c651822. * build crt1-*.o with `-fPIC` This ensures they can be used in a PIE or PIC context. Signed-off-by: Joel Dice <[email protected]> * ignore `__memory_base` when checking undefined symbols Whether this symbol appears varies between LLVM versions. Signed-off-by: Joel Dice <[email protected]> * Revert "move `__main_void` from __main_void.c to crt1-command.c" This reverts commit f303835. * add explanatory comments to __main_void.c Signed-off-by: Joel Dice <[email protected]> * add `__wasilibc_unmodified_upstream` and comment to `__lctrans_cur` Signed-off-by: Joel Dice <[email protected]> --------- Signed-off-by: Joel Dice <[email protected]>
- Loading branch information