mirror of
https://github.com/golang/go
synced 2024-11-21 23:14:40 -07:00
cmd/go: make sure the linker for shared doesn't include tempdir path
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
This commit is contained in:
parent
165bf241f2
commit
ee40cf81ac
@ -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 {
|
||||
|
10
src/cmd/go/testdata/script/build_shared_reproducible.txt
vendored
Normal file
10
src/cmd/go/testdata/script/build_shared_reproducible.txt
vendored
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user