Skip to content

Commit

Permalink
cmd/go: make sure the linker for shared doesn't include tempdir path
Browse files Browse the repository at this point in the history
This is similar to CL 478196 and CL 477296,
but this is for -buildmode=shared.

When using "go install -buildmode=shared std",
because the gold linker is used by default on Linux arm64,
it will cause temporary paths to be included in libstd.so.

Based on the changes of CL 478196,
I speculate that this may also have issues on other platforms.
So, this change is for all platform.

But I don't have any other platforms and
don't know what the file name for verification,
so the testcase are only for the Linux platform.
I hope someone can improve this testcase. Thanks!

Fixes #69464
  • Loading branch information
And-ZJ committed Sep 19, 2024
1 parent 165bf24 commit ee40cf8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
16 changes: 15 additions & 1 deletion src/cmd/go/internal/work/gc.go
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,21 @@ func (gcToolchain) ldShared(b *Builder, root *Action, toplevelactions []*Action,
}
ldflags = append(ldflags, d.Package.ImportPath+"="+d.Target)
}
return b.Shell(root).run(".", targetPath, nil, cfg.BuildToolexec, base.Tool("link"), "-o", targetPath, "-importcfg", importcfg, ldflags)

// On OS X when using external linking to build a shared library,
// the argument passed here to -o ends up recorded in the final
// shared library in the LC_ID_DYLIB load command.
// To avoid putting the temporary output directory name there
// (and making the resulting shared library useless),
// run the link in the output directory so that -o can name
// just the final path element.
// On Windows, DLL file name is recorded in PE file
// export section, so do like on OS X.
// On Linux, for a shared object, at least with the Gold linker,
// the output file path is recorded in the .gnu.version_d section.
dir, targetPath := filepath.Split(targetPath)

return b.Shell(root).run(dir, targetPath, nil, cfg.BuildToolexec, base.Tool("link"), "-o", targetPath, "-importcfg", importcfg, ldflags)
}

func (gcToolchain) cc(b *Builder, a *Action, ofile, cfile string) error {
Expand Down
10 changes: 10 additions & 0 deletions src/cmd/go/testdata/script/build_shared_reproducible.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[!buildmode:shared] skip
[short] skip
[!cgo] skip '-buildmode=shared requires external linking'
[!GOOS:linux] skip

env GO111MODULE=off
env CGO_ENABLED=1
go install -a -trimpath -buildvcs=false -buildmode=shared -pkgdir=pkgdir1 runtime
go install -a -trimpath -buildvcs=false -buildmode=shared -pkgdir=pkgdir2 runtime
[GOOS:linux] cmp -q pkgdir1/libruntime.so pkgdir2/libruntime.so

0 comments on commit ee40cf8

Please sign in to comment.