1
0
mirror of https://github.com/golang/go synced 2024-11-18 13:44:48 -07:00

cmd/go, cmd/link: provide meaningful error msg with ext linking on ppc64

linux/ppc64 uses the ppc64 v1 ABI which was never fully supported
by Go. (linux/ppc64le uses the ppc64 v2 ABI and that is fully
supported).

As a result if the external linker is used to build a program
on ppc64, there is a either a warning or error message that doesn't
clearly describe the problem. In the case of a warning,
a program is created that will most likely not execute since it is not
built as expected for the ppc64 dynamic linker (ld64.so.1).

To avoid confusion in these cases, error messages are now issued
if external linker is explicitly used to build the program. Note that most
buildmodes that require external linking were already flagging linux/ppc64
as unsupported except for c-archive, which has been added here.

This problem does not occur with gccgo since the ppc64 v1 ABI is
supported there.

Fixes #25079

Change-Id: I44d77a1eb9df750d499cd432b0ca4a97f0be88b2
Reviewed-on: https://go-review.googlesource.com/109915
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Lynn Boger 2018-04-27 08:07:48 -04:00 committed by Brad Fitzpatrick
parent 166c37a7d0
commit 506d6a32ce
2 changed files with 13 additions and 0 deletions

View File

@ -83,6 +83,9 @@ func buildModeInit() {
default:
switch cfg.Goos {
case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
if platform == "linux/ppc64" {
base.Fatalf("-buildmode=c-archive not supported on %s\n", platform)
}
// Use -shared so that the result is
// suitable for inclusion in a PIE or
// shared library.

View File

@ -240,6 +240,9 @@ func determineLinkMode(ctxt *Link) {
}
ctxt.LinkMode = LinkInternal
case "1":
if objabi.GOARCH == "ppc64" {
Exitf("external linking requested via GO_EXTLINK_ENABLED but not supported for linux/ppc64")
}
ctxt.LinkMode = LinkExternal
default:
if needed, _ := mustLinkExternal(ctxt); needed {
@ -251,10 +254,17 @@ func determineLinkMode(ctxt *Link) {
} else {
ctxt.LinkMode = LinkInternal
}
if objabi.GOARCH == "ppc64" && ctxt.LinkMode == LinkExternal {
Exitf("external linking is not supported for linux/ppc64")
}
}
case LinkInternal:
if needed, reason := mustLinkExternal(ctxt); needed {
Exitf("internal linking requested but external linking required: %s", reason)
}
case LinkExternal:
if objabi.GOARCH == "ppc64" {
Exitf("external linking not supported for linux/ppc64")
}
}
}