mirror of
https://git.proxmox.com/git/wasi-libc
synced 2025-08-17 07:49:36 +00:00

* 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 <joel.dice@fermyon.com> 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 <joel.dice@fermyon.com> 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 <joel.dice@fermyon.com> remove dl.c I'll open a separate PR for this later. Signed-off-by: Joel Dice <joel.dice@fermyon.com> update `check-symbols` files Signed-off-by: Joel Dice <joel.dice@fermyon.com> * generate separate .so files for emulated features Signed-off-by: Joel Dice <joel.dice@fermyon.com> * 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 <joel.dice@fermyon.com> * remove redundant `$(OBJDIR)/%.long-double.pic.o` rule in Makefile Signed-off-by: Joel Dice <joel.dice@fermyon.com> * consolidate libwasi-emulated-*.so into a single library Signed-off-by: Joel Dice <joel.dice@fermyon.com> * add comment explaining use of `--whole-archive` Signed-off-by: Joel Dice <joel.dice@fermyon.com> * Revert "remove redundant `$(OBJDIR)/%.long-double.pic.o` rule in Makefile" This reverts commit dbe2cb10541dd27e4e0ed71d30ce304b9c9133d6. * 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 <joel.dice@fermyon.com> * Revert "consolidate libwasi-emulated-*.so into a single library" This reverts commit c6518223a49f60e4bb254a3e77a411fdade18df2. * build crt1-*.o with `-fPIC` This ensures they can be used in a PIE or PIC context. Signed-off-by: Joel Dice <joel.dice@fermyon.com> * ignore `__memory_base` when checking undefined symbols Whether this symbol appears varies between LLVM versions. Signed-off-by: Joel Dice <joel.dice@fermyon.com> * Revert "move `__main_void` from __main_void.c to crt1-command.c" This reverts commit f3038354610b7eb18bfd39092a2ccc3b72842dc4. * add explanatory comments to __main_void.c Signed-off-by: Joel Dice <joel.dice@fermyon.com> * add `__wasilibc_unmodified_upstream` and comment to `__lctrans_cur` Signed-off-by: Joel Dice <joel.dice@fermyon.com> --------- Signed-off-by: Joel Dice <joel.dice@fermyon.com>
16 lines
188 B
C
16 lines
188 B
C
#ifndef __wasilibc___errno_h
|
|
#define __wasilibc___errno_h
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern _Thread_local int errno;
|
|
|
|
#define errno errno
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|