On Sat, Aug 12, 2023 at 10:27 AM jlfo...@berkeley.edu
<jlforr...@berkeley.edu> wrote:
>
> Thanks.
>
> There's a more fundamental problem, though. Try running
>
> go build -linkshared hello.go
>
> as a non-privileged user. You'll get a bunch of permission denied messages. 
> (I had mentioned this
> back in January). This is why I'm fooling around running the compiler and 
> linker manually.
>
> I suggest you add this to your test suite.

To be clear, I ran all the commands I listed as a non-privileged user.

It's not clear why you are running any of the commands as root.

Ian


> On Friday, August 11, 2023 at 10:00:12 PM UTC-7 Ian Lance Taylor wrote:
>>
>> On Fri, Aug 11, 2023 at 6:15 PM jlfo...@berkeley.edu
>> <jlfo...@berkeley.edu> wrote:
>> >
>> > Now that Go 1.21 has been released, I've returned to trying to figure out 
>> > how to
>> > dynamically link a Go program. Back in January I posted the results of my 
>> > first attempt
>> > with an earlier version of Go, which was:
>> >
>> > 1) Building a Go shared library by running
>> >
>> > go install -buildmode=shared std
>> >
>> > as root works fine.
>> >
>> > 2) Building a dynamically linked Go executable as a non-privileged user by 
>> > adding
>> >
>> > -linkshared
>> >
>> > to "go build" fails with lots of file access permission errors because
>> > the go build tool tries to write to the Go shared library, which a 
>> > non-privileged
>> > user can't do.
>> >
>> > 3) Building a dynamically link Go executable as root works but a new 
>> > version
>> > of the Go shared library gets made in the process. This makes this command
>> > take much longer than it should. Plus, having to be root is a non-starter.
>> >
>> > I started looking at what "go build" is doing by adding the "-x" option.
>> > I was able to figure out how to build and link the following program
>> >
>> > package main
>> > func main() {
>> > }
>> >
>> > using a shared library. This was quite an accomplishment. But, then I 
>> > tried making it into
>> > a "Hello, world!" program.
>> >
>> > package main
>> > import "fmt"
>> > func main() {
>> > fmt.Println("Hello, world!\n")
>> > }
>> >
>> > This also compiles and links, but running it results in
>> >
>> > panic: runtime error: invalid memory address or nil pointer dereference
>> > [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 
>> > pc=0x7fe02814e593]
>> >
>> > goroutine 1 [running]:
>> > os.(*File).write(...)
>> > /usr/local/go/src/os/file_posix.go:46
>> > os.(*File).Write(0x0, {0xc0003a6000?, 0xf, 0x7fe028059f25?})
>> > /usr/local/go/src/os/file.go:183 +0x53
>> > fmt.Fprintln({0x202f88, 0x0}, {0xc00035af20, 0x1, 0x1})
>> > /usr/local/go/src/fmt/print.go:305 +0x6f
>> > fmt.Println(...)
>> > /usr/local/go/src/fmt/print.go:314
>> >
>> > To compile the program I ran
>> >
>> > WORK=/tmp/go-build3183434751
>> > /usr/local/go/pkg/tool/linux_amd64/compile -p main -complete 
>> > -installsuffix dynlink -goversion go1.21.0 -c=3 -dynlink -linkshared 
>> > -nolocalimports -importcfg $WORK/b001/importcfg ./file1.go
>> >
>> > and to link it I ran
>> >
>> > WORK=/tmp/go-build3183434751
>> > /usr/local/go/pkg/tool/linux_amd64/link -o a.out -importcfg 
>> > $WORK/b001/importcfg.link -buildmode=exe -linkshared -w file1.o
>> >
>> > $WORK/b001/importcfg is
>> > packagefile fmt=/usr/local/go/pkg/linux_amd64_dynlink/fmt.a
>> > packagefile runtime=/usr/local/go/pkg/linux_amd64_dynlink/runtime.a
>> > packagefile runtime/cgo=/usr/local/go/pkg/linux_amd64_dynlink/runtime/cgo.a
>> >
>> > $WORK/b001/importcfg.link is many lines like
>> > packagefile fmt=/usr/local/go/pkg/linux_amd64_dynlink/fmt.a
>> > packageshlib fmt=/usr/local/go/pkg/linux_amd64_dynlink/libstd.so
>> >
>> > Both these files were created when I ran the regular "go build 
>> > -linkedshare" command.
>> > I have to admit that I don't really understand what these files should 
>> > contain,
>> > and I wouldn't be surprised if this is what's causing my problem.
>> >
>> > Any suggestions for what I'm doing wrong?
>>
>> Thanks. This looks like a bug. Somehow we must not be testing quite
>> this case in our -buildmode=shared testsuite.
>>
>> I opened https://go.dev/issue/61973.
>>
>> Ian
>
> --
> 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/b644a419-b3a7-4021-9e1c-b8954e07000cn%40googlegroups.com.

-- 
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/CAOyqgcU-8d205nmt1bxWuO3tffrzN4336y73yVH5GEGCOsNPQA%40mail.gmail.com.

Reply via email to