1
0
mirror of https://github.com/golang/go synced 2024-11-16 23:14:42 -07:00

cmd/go: use the last -linkmode flag to determine external linking

Current linkmode checking in determining package dependencies doesn't
take multiple -linkmode options into consideration, may lead to redundant
dependency on 'runtime/cgo'.

Fixes the problem and adds a testcase.

Change-Id: Iac5ea9fb3ca5ef931201afd0f3441f41f946c919
Reviewed-on: https://go-review.googlesource.com/c/go/+/263497
Trust: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
Xiangdong Ji 2020-10-18 11:43:23 -07:00 committed by Bryan C. Mills
parent b4c8b67adc
commit 61313dab52
2 changed files with 13 additions and 5 deletions

View File

@ -1978,16 +1978,20 @@ func externalLinkingForced(p *Package) bool {
// external linking mode, as of course does
// -ldflags=-linkmode=external. External linking mode forces
// an import of runtime/cgo.
// If there are multiple -linkmode options, the last one wins.
pieCgo := cfg.BuildBuildmode == "pie" && !sys.InternalLinkPIESupported(cfg.BuildContext.GOOS, cfg.BuildContext.GOARCH)
linkmodeExternal := false
if p != nil {
ldflags := BuildLdflags.For(p)
for i, a := range ldflags {
if a == "-linkmode=external" {
linkmodeExternal = true
}
if a == "-linkmode" && i+1 < len(ldflags) && ldflags[i+1] == "external" {
for i := len(ldflags) - 1; i >= 0; i-- {
a := ldflags[i]
if a == "-linkmode=external" ||
a == "-linkmode" && i+1 < len(ldflags) && ldflags[i+1] == "external" {
linkmodeExternal = true
break
} else if a == "-linkmode=internal" ||
a == "-linkmode" && i+1 < len(ldflags) && ldflags[i+1] == "internal" {
break
}
}
}

View File

@ -63,6 +63,10 @@ stderr 'link.* -X=math.pi=3'
go build -n -ldflags=-X=math.pi=3
stderr 'link.* -X=math.pi=3'
# cgo.a should not be a dependency of internally-linked go package
go build -ldflags='-linkmode=external -linkmode=internal' -n prog.go
! stderr 'packagefile .*runtime/cgo.a'
-- z1/z.go --
package z1
import _ "y"