golang build -i -a fails (permission denied)

9.1k views Asked by At

I am a go newbie.

I have installed golang 1.9 from the official binary distribution on my ubuntu. I have also installed the Gogland IDE.

When I try to debug the simplest go program ("hello world") using Gogland, I get the following error:

GOROOT=/usr/local/go
GOPATH=/home/user/go
/usr/local/go/bin/go build -i -o /tmp/defaultgo -gcflags "-N -l" -a /home/user/go/src/hello/hello.go
go install runtime/internal/sys: open /usr/local/go/pkg/linux_amd64/runtime/internal/sys.a: permission denied

When trying to build from the command line (not using Gogland), I noticed that I get the same error whenever I am using the -i -a switches.

2

There are 2 answers

0
dlsniper On BEST ANSWER

Edit: EAP 13 was just released and it fixes this specific problem. Please see: https://blog.jetbrains.com/go/2017/09/04/gogland-eap-13-better-completion-new-inspections-fixed-performance-bugs-and-more/

Original:

This happens because of upgraded support from Delve for Go 1.9 projects.

The latest version of Delve will use -a in order to recompile all transitive dependencies and ensure none of them are included with their optimized versions instead of the debugging friendly ones so that it can remove a lot of potential bugs.

You can remove the -i flag so that the dependencies are not installed, which shouldn't cause the error anymore.

This will be improved hopefully in Go 1.10 as there are changes depending on the Go team.

Hope this explains the issue, if not, please see the discussion here: https://youtrack.jetbrains.com/issue/GO-4382

Edit: this will be addressed in the EAP 13, which is bound to be released very soon, see the tracking issue here: https://youtrack.jetbrains.com/issue/GO-4430 as it contains additional details regarding this problem

5
kostix On

The -a command-line option tells the go tool to rebuild "everything Go", and this includes the Go standard library and even the Go runtime itself—that stuff linked to each Go program which actually implements goroutines and all the interesting bits.

Since you have Go installed into a location not normally writable by end users (/usr/local/go), an attempt to recompile and update files there (/usr/local/go/pkg) rightfully fails with "permission denied".

The main takeaway is that there is exactly zero cases you'd need to pass -a to go build until you very well understand what you want to achieve, and this will come quite later in your learning curve ;-)

So please do what @Volker said:

  • Don't set GOROOT.
  • Don't use -a with go build.

Also condier using go install instead of go build — for the reasons explained here.