- 
                Notifications
    
You must be signed in to change notification settings  - Fork 134
 
Linking wasmvm_muslc
        Christoph Otter edited this page Feb 27, 2024 
        ·
        2 revisions
      
    Starting with wasmvm v1.0.0-beta9, the two static library builds libwasmvm_muslc.aarch64.a and libwasmvm_muslc.x86_64.a are deployed. Those static libraries for Linux use a statically linked musl libc. The libraries are made for Alpine Linux but the resulting binaries also run on other distributions like Debian.
The following steps use libwasmvm_muslc.x86_64.a for succinctness, but it works the same way for libwasmvm_muslc.aarch64.a.
- Download them from GitHub releases to your build system
 - Move 
libwasmvm_muslc.x86_64.ato a default library folder of your system (e.g./libfor Alpine Linux). For versions before 2.0, you had to rename this tolibwasmvm_muslc.abefore, but this is not necessary anymore. - Add the build flags 
-linkmode=external -extldflags '-Wl,-z,muldefs -static'andmuslctag to youtgo buildcommand, e.g.Before the upgrade to Rust 1.56.0+, the resulting binary was statically linked by default. Now we have to be explicit.go build -ldflags "-linkmode=external -extldflags '-Wl,-z,muldefs -static'" -tags muslc \ -o demo ./cmd/demo - Use 
fileto check if the resulting binary was statically linked:$ file /code/build/wasmd ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=QN0ROsCeqcPMyxlFbUzY/hzS-Y64fQc5lRiMuUIF_/sGKzbwyqPD97q7uMHE9w/Yu9a5qtHsFDSRYK0wXTs, not stripped 
The full integration process can be seen in this wasmd PR.
To learn more about linking with Go, we recommend the following ressources:
- "2. If you really need CGO, but not netcgo" in https://dubo-dubon-duponey.medium.com/a-beginners-guide-to-cross-compiling-static-cgo-pie-binaries-golang-1-16-792eea92d5aa
 - For why we need 
-Wl,-z,muldefs: https://github.com/rust-lang/rust/issues/78919 - Advanced Go binary builds: https://wiki.archlinux.org/title/Go_package_guidelines