Skip to content

Commit a35b453

Browse files
authored
add shared library support (#338)
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. Signed-off-by: Joel Dice <[email protected]>
1 parent 71fd9cb commit a35b453

File tree

3 files changed

+20
-15
lines changed

3 files changed

+20
-15
lines changed

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
url = https://github.com/llvm/llvm-project
44
[submodule "src/wasi-libc"]
55
path = src/wasi-libc
6-
url = https://github.com/CraneStation/wasi-libc
6+
url = https://github.com/WebAssembly/wasi-libc
77
[submodule "src/config"]
88
path = src/config
99
url = https://git.savannah.gnu.org/git/config.git

Makefile

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,13 @@ build/llvm.BUILT:
107107
llvm-config
108108
touch build/llvm.BUILT
109109

110-
build/wasi-libc.BUILT: build/llvm.BUILT
110+
build/wasi-libc.BUILT: build/compiler-rt.BUILT
111111
$(MAKE) -C $(ROOT_DIR)/src/wasi-libc \
112112
CC=$(BUILD_PREFIX)/bin/clang \
113113
AR=$(BUILD_PREFIX)/bin/llvm-ar \
114114
NM=$(BUILD_PREFIX)/bin/llvm-nm \
115-
SYSROOT=$(BUILD_PREFIX)/share/wasi-sysroot
115+
SYSROOT=$(BUILD_PREFIX)/share/wasi-sysroot \
116+
default libc_so
116117
$(MAKE) -C $(ROOT_DIR)/src/wasi-libc \
117118
CC=$(BUILD_PREFIX)/bin/clang \
118119
AR=$(BUILD_PREFIX)/bin/llvm-ar \
@@ -121,7 +122,7 @@ build/wasi-libc.BUILT: build/llvm.BUILT
121122
THREAD_MODEL=posix
122123
touch build/wasi-libc.BUILT
123124

124-
build/compiler-rt.BUILT: build/llvm.BUILT build/wasi-libc.BUILT
125+
build/compiler-rt.BUILT: build/llvm.BUILT
125126
# Do the build, and install it.
126127
mkdir -p build/compiler-rt
127128
cd build/compiler-rt && cmake -G Ninja \
@@ -151,48 +152,52 @@ build/compiler-rt.BUILT: build/llvm.BUILT build/wasi-libc.BUILT
151152
touch build/compiler-rt.BUILT
152153

153154
# Flags for libcxx and libcxxabi.
155+
# $(1): pthreads ON or OFF
156+
# $(2): shared libraries ON or OFF
154157
LIBCXX_CMAKE_FLAGS = \
155158
-DCMAKE_C_COMPILER_WORKS=ON \
156159
-DCMAKE_CXX_COMPILER_WORKS=ON \
157160
-DCMAKE_AR=$(BUILD_PREFIX)/bin/ar \
158161
-DCMAKE_MODULE_PATH=$(ROOT_DIR)/cmake \
159162
-DCMAKE_TOOLCHAIN_FILE=$(ROOT_DIR)/wasi-sdk.cmake \
160163
-DCMAKE_STAGING_PREFIX=$(PREFIX)/share/wasi-sysroot \
164+
-DCMAKE_POSITION_INDEPENDENT_CODE=$(2) \
161165
-DLLVM_CONFIG_PATH=$(ROOT_DIR)/build/llvm/bin/llvm-config \
162166
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
163167
-DCXX_SUPPORTS_CXX11=ON \
164-
-DLIBCXX_ENABLE_THREADS:BOOL=@PTHREAD@ \
165-
-DLIBCXX_HAS_PTHREAD_API:BOOL=@PTHREAD@ \
168+
-DLIBCXX_ENABLE_THREADS:BOOL=$(1) \
169+
-DLIBCXX_HAS_PTHREAD_API:BOOL=$(1) \
166170
-DLIBCXX_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
167171
-DLIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
168172
-DLIBCXX_HAS_WIN32_THREAD_API:BOOL=OFF \
169173
-DLLVM_COMPILER_CHECKED=ON \
170174
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
171-
-DLIBCXX_ENABLE_SHARED:BOOL=OFF \
175+
-DLIBCXX_ENABLE_SHARED:BOOL=$(2) \
172176
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL=OFF \
173177
-DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \
174178
-DLIBCXX_ENABLE_FILESYSTEM:BOOL=OFF \
179+
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT:BOOL=OFF \
175180
-DLIBCXX_CXX_ABI=libcxxabi \
176181
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(LLVM_PROJ_DIR)/libcxxabi/include \
177182
-DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \
178183
-DLIBCXX_ABI_VERSION=2 \
179184
-DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \
180-
-DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \
185+
-DLIBCXXABI_ENABLE_SHARED:BOOL=$(2) \
181186
-DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \
182-
-DLIBCXXABI_ENABLE_THREADS:BOOL=@PTHREAD@ \
183-
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=@PTHREAD@ \
187+
-DLIBCXXABI_ENABLE_THREADS:BOOL=$(1) \
188+
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=$(1) \
184189
-DLIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
185190
-DLIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL=OFF \
186191
-DLIBCXXABI_HAS_WIN32_THREAD_API:BOOL=OFF \
187-
-DLIBCXXABI_ENABLE_PIC:BOOL=OFF \
192+
-DLIBCXXABI_ENABLE_PIC:BOOL=$(2) \
188193
-DWASI_SDK_PREFIX=$(BUILD_PREFIX) \
189194
-DUNIX:BOOL=ON \
190195
--debug-trycompile
191196

192-
build/libcxx.BUILT: build/llvm.BUILT build/compiler-rt.BUILT build/wasi-libc.BUILT
197+
build/libcxx.BUILT: build/llvm.BUILT build/wasi-libc.BUILT
193198
# Do the build.
194199
mkdir -p build/libcxx
195-
cd build/libcxx && cmake -G Ninja $(LIBCXX_CMAKE_FLAGS:@PTHREAD@=OFF) \
200+
cd build/libcxx && cmake -G Ninja $(call LIBCXX_CMAKE_FLAGS,OFF,ON) \
196201
-DCMAKE_SYSROOT=$(BUILD_PREFIX)/share/wasi-sysroot \
197202
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP) $(EXTRA_CFLAGS)" \
198203
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP) $(EXTRA_CXXFLAGS)" \
@@ -202,7 +207,7 @@ build/libcxx.BUILT: build/llvm.BUILT build/compiler-rt.BUILT build/wasi-libc.BUI
202207
$(LLVM_PROJ_DIR)/runtimes
203208
ninja $(NINJA_FLAGS) -C build/libcxx
204209
mkdir -p build/libcxx-threads
205-
cd build/libcxx-threads && cmake -G Ninja $(LIBCXX_CMAKE_FLAGS:@PTHREAD@=ON) \
210+
cd build/libcxx-threads && cmake -G Ninja $(call LIBCXX_CMAKE_FLAGS,ON,OFF) \
206211
-DCMAKE_SYSROOT=$(BUILD_PREFIX)/share/wasi-sysroot \
207212
-DCMAKE_C_FLAGS="$(DEBUG_PREFIX_MAP) -pthread $(EXTRA_CFLAGS)" \
208213
-DCMAKE_CXX_FLAGS="$(DEBUG_PREFIX_MAP) -pthread $(EXTRA_CXXFLAGS)" \

0 commit comments

Comments
 (0)