Cross-compiling Go programs for multiple architectures and platforms

Golang compile cross-compile multiarch GOOS GOARCH

2 min read | by Jordi Prats

One of Go's great features is the ability to cross-compile your code for different platforms and architectures, allowing you to run your applications on a variety of systems.

To do so we won't need to install emulators or additional tools, we are just going to use the go command

To compile a Go program for any architecture, we'll set the GOOS and GOARCH environment variables.

  • GOOS: Specifies the operating system to compile the binary for: linux, darwin, windows, etc.
  • GOARCH: Specifies the architecture: 386, amd64, arm, arm64, etc.

For example, if you want to compile a binary for a 64-bit Linux system, you would use the following command:

GOARCH=amd64 GOOS=linux go build -a -o ./build/example_linux_amd64 example.go

Checking the file we'll see how the resulting file is in fact a ELF binary ready to be used by a x86-64 computer:

$ file build/example_linux_amd64
build/example_linux_amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=z1W_Vvnh_RlwKHfE1Kfp/tFKNRuPiPNmYL8LonCxQ/Dk9unwPOfyQpy-9MqmXa/yl_7io8z9mJO61wIYwx7, with debug_info, not stripped

We can repeat the command for other architectures and systems, for example:

GOARCH=arm64 GOOS=darwin go build -a -o ./build/example_mac_arm64 example.go
GOARCH=arm64 GOOS=windows go build -a -o ./build/example_windows_arm64 example.go
GOARCH=amd64 GOOS=darwin go build -a -o ./build/example_mac_intel example.go

So we would get:

$ file build/example_*
build/example_linux_amd64:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=z1W_Vvnh_RlwKHfE1Kfp/tFKNRuPiPNmYL8LonCxQ/Dk9unwPOfyQpy-9MqmXa/yl_7io8z9mJO61wIYwx7, with debug_info, not stripped
build/example_mac_arm64:     Mach-O 64-bit executable arm64
build/example_mac_intel:     Mach-O 64-bit executable x86_64
build/example_windows_arm64: PE32+ executable (console) Aarch64 (stripped to external PDB), for MS Windows

Therefore, if you want to compile a binary for multiple architectures, all we need is creating a script to run the go command with the appropriate environment variables to generate the binaries for the of the specified architectures.


Posted on 07/02/2023

Categories