Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Go 1.17+ crashes on Docker Desktop (M1) when running with "--platform=linux/amd64" platform #48439

Closed
remiphilippe opened this issue Sep 17, 2021 · 2 comments

Comments

@remiphilippe
Copy link

What version of Go are you using (go version)?

$ go version
go version go1.17.1 linux/amd64
$ go version
go version go1.17 linux/amd64

Does this issue reproduce with the latest release?

yes, seems to happen since 1.17

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.1"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1554028404=/tmp/go-build -gno-record-gcc-switches"

What did you do?

When running on docker (4.0.1) on a Mac M1 and cross launching docker run -it --platform linux/amd64 golang /bin/bash, it's impossible to build any files, and randomly go commands will fail. For example:

root@d7d6c6bb9361:/go# go env
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go env
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go env
GO111MODULE=""
GOARCH="amd64"
...
root@d7d6c6bb9361:/go# go fmt main.go 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go fmt main.go 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go fmt main.go 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go fmt main.go 
main.go

When trying to build a simple hello world:

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Printf("Hello World\n")
	os.Exit(0)
}
root@d7d6c6bb9361:/go# go build main.go 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# go build main.go 
go tool asm: signal: segmentation fault
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
root@d7d6c6bb9361:/go# go build main.go 
go tool compile: signal: segmentation fault
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
root@d7d6c6bb9361:/go# go build main.go 
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@d7d6c6bb9361:/go# 

First seen on 1.17.0

root@54e7a68fce75:/go# go version
go version go1.17 linux/amd64
root@54e7a68fce75:/go# go version
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
root@54e7a68fce75:/go# go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1438856927=/tmp/go-build -gno-record-gcc-switches"
root@54e7a68fce75:/go# 

These steps work fine with go 1.16.8

root@3d98519b38c9:/go# go version
go version go1.16.8 linux/amd64
root@3d98519b38c9:/go# go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16.8"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build798857633=/tmp/go-build -gno-record-gcc-switches"
root@3d98519b38c9:/go# 

and also on arm64:

root@7e22aa87e7bf:/go# arch
aarch64
root@7e22aa87e7bf:/go# go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_arm64"
GOVCS=""
GOVERSION="go1.17"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build4266682342=/tmp/go-build -gno-record-gcc-switches"
root@7e22aa87e7bf:/go# go version
go version go1.17 linux/arm64
root@7e22aa87e7bf:/go#  

Not sure if this is go or qemu (docker) related. When running arm64, there is no qemu involved.
arm64:

root@7e22aa87e7bf:/go# ps afx
  PID TTY      STAT   TIME COMMAND
    1 pts/0    Ss     0:00 /bin/bash
   28 pts/0    R+     0:00 ps afx

amd64:

root@6e22964b6f86:/go# ps afx
  PID TTY      STAT   TIME COMMAND
    1 pts/0    Ssl    0:00 /usr/bin/qemu-x86_64 /bin/bash
    9 ?        Rl+    0:00 /bin/ps afx

for reference: golang-nuts thread:
https://groups.google.com/g/golang-nuts/c/BxPjtPjN11A

What did you expect to see?

something else then a segfault :)

What did you see instead?

a segfault

@cherrymui
Copy link
Member

QEMU is not currently a supported platform, especially user-mode emulation. Feel free to reopen if you can reproduce without QEMU. Thanks.

@jbiel
Copy link

jbiel commented Apr 5, 2022

We ran up against a similar issue and found that segfaults occur only when using golang binaries built with Alpine-based golang images. Switching to the standard Golang Docker images fixed our issue.

@golang golang locked and limited conversation to collaborators Apr 5, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants