Build Static Go App with Musl

Discover how to build a static Go App with Musl for better portability and easier distribution

In the world of software development, portability and ease of distribution are important. With static compilation you will get binary file independent of Linux distribution and library versions.

Install Musl

Musl is an implementation of the C standard library. It implements an interface layer between Linux kernel and Go standard library. With Musl, you can achieve truly statically compiled binary files, even when CGO is enbaled.

Install musl toolchain and other build tools on your Ubuntu:

sudo apt update
sudo apt install build-essential musl-tools pkg-config libssl-dev

Build Go App

Point Go to the Musl compiler with the CC environmet variable:

CC=/usr/bin/musl-gcc go build \
    -ldflags "-s -w -linkmode external -extldflags -static" \
    ./cmd/example

The ldflags attribute provides options for linker to build a static binary file. After compilation, you will find binary file in the current directory. In our case, the binary file name is example.

Check binary file

You can check any binary file with the ldd command:

ldd example

For statically compiled binary files, result will be:

not a dynamic executable

For dynamically compiled binary files, result will be a list of the linked libraries.