I'm the original poster. I've looked into this more and I might have an 
explanation for
what's going on.

Just for yuks, I started with perhaps the simplest Go program, which I 
called t.go:

package main
func main() {
}

As root, I was able to build both a dynamically (21512 bytes) and a 
statically (1203019 bytes) linked  executable.
This is with go version go1.19.4 linux/amd64.

I then ran

go build -linkshared -x t.go

This showed all the commands the go tool executed. I saved these commands 
in a file
so I could look more closely at what was going on.

Here's what I think is going on. When running go build -linkshared go 
attempts to create a new
version of the shared runtime library. At first glance, it appears that 
only the code that's necessary
to run the executable is put there (I'm not 100% sure about this). But it's 
clear that a new file
called

/usr/local/go/pkg/linux_amd64_dynlink/libstd.so

is created. As a normal user I create or write to this file, which is why I 
get all
the permission denied error messages. So, the main question is why does go 
build create
this library when I already ran

go install -buildmode=shared std 

to create the shared library?

To continue, as root I changed the ownership of

/usr/local/go/pkg/linux_amd64_dynlink 

to me, and then, as me, was finally able to create the dynamically linked 
executable!

So, to answer my original question, the reason I can't create a dynamically 
linked
executable is because the go build tool attempts to create a new shared 
library in
a location that a normal user can't write to. Whether it's actually 
necessary to
create this shared library I can't say, but if so, it should be done an a 
directory
that a normal user can write to.

This also answers the second question, which is why it takes longer to 
create a dynamically
linked executable than a statically linked executable. This is due to the 
time it takes to
build the possibly-extraneous shared library.

I welcome any comments and/or corrections to any of this.

Cordially,
Jon Forrest

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/6a17b197-3e57-4a3d-9a84-4a01ba04bf31n%40googlegroups.com.

Reply via email to