Commit 506d6a32 authored by Lynn Boger's avatar Lynn Boger Committed by Brad Fitzpatrick

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/109915Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 166c37a7
...@@ -83,6 +83,9 @@ func buildModeInit() { ...@@ -83,6 +83,9 @@ func buildModeInit() {
default: default:
switch cfg.Goos { switch cfg.Goos {
case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris": 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 // Use -shared so that the result is
// suitable for inclusion in a PIE or // suitable for inclusion in a PIE or
// shared library. // shared library.
......
...@@ -240,6 +240,9 @@ func determineLinkMode(ctxt *Link) { ...@@ -240,6 +240,9 @@ func determineLinkMode(ctxt *Link) {
} }
ctxt.LinkMode = LinkInternal ctxt.LinkMode = LinkInternal
case "1": case "1":
if objabi.GOARCH == "ppc64" {
Exitf("external linking requested via GO_EXTLINK_ENABLED but not supported for linux/ppc64")
}
ctxt.LinkMode = LinkExternal ctxt.LinkMode = LinkExternal
default: default:
if needed, _ := mustLinkExternal(ctxt); needed { if needed, _ := mustLinkExternal(ctxt); needed {
...@@ -251,10 +254,17 @@ func determineLinkMode(ctxt *Link) { ...@@ -251,10 +254,17 @@ func determineLinkMode(ctxt *Link) {
} else { } else {
ctxt.LinkMode = LinkInternal ctxt.LinkMode = LinkInternal
} }
if objabi.GOARCH == "ppc64" && ctxt.LinkMode == LinkExternal {
Exitf("external linking is not supported for linux/ppc64")
}
} }
case LinkInternal: case LinkInternal:
if needed, reason := mustLinkExternal(ctxt); needed { if needed, reason := mustLinkExternal(ctxt); needed {
Exitf("internal linking requested but external linking required: %s", reason) Exitf("internal linking requested but external linking required: %s", reason)
} }
case LinkExternal:
if objabi.GOARCH == "ppc64" {
Exitf("external linking not supported for linux/ppc64")
}
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment