diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index 9091f98636..bf398726e2 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -131,6 +131,15 @@ func buildModeInit() { ldBuildmode = "c-shared" case "default": switch cfg.Goos { + case "linux": + switch cfg.Goarch { + case "ppc64le": + codegenArg = "-shared" + ldBuildmode = "pie" + default: + ldBuildmode = "exe" + } + case "android": codegenArg = "-shared" ldBuildmode = "pie" diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 7c5877bfbd..6fe34093b7 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -409,7 +409,6 @@ func (ctxt *Link) loadlib() { } } - // load internal packages, if not already if *flagRace { loadinternal(ctxt, "runtime/race") } @@ -435,7 +434,7 @@ func (ctxt *Link) loadlib() { // We now have enough information to determine the link mode. determineLinkMode(ctxt) - if ctxt.LinkMode == LinkExternal && !iscgo && ctxt.LibraryByPkg["runtime/cgo"] == nil && !(objabi.GOOS == "darwin" && ctxt.BuildMode != BuildModePlugin && (ctxt.Arch.Family == sys.AMD64 || ctxt.Arch.Family == sys.I386)) { + if ctxt.LinkMode == LinkExternal && !iscgo && ctxt.LibraryByPkg["runtime/cgo"] == nil && !(objabi.GOOS == "darwin" && ctxt.BuildMode != BuildModePlugin && (ctxt.Arch.Family == sys.AMD64 || ctxt.Arch.Family == sys.I386) || ctxt.Arch.Family == sys.PPC64) { // This indicates a user requested -linkmode=external. // The startup code uses an import of runtime/cgo to decide // whether to initialize the TLS. So give it one. This could @@ -1469,7 +1468,7 @@ func (ctxt *Link) hostlink() { // does not work, the resulting programs will not run. See // issue #17847. To avoid this problem pass -no-pie to the // toolchain if it is supported. - if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared { + if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared && !(ctxt.Arch.Family == sys.PPC64 && objabi.GOOS == "linux") { // GCC uses -no-pie, clang uses -nopie. for _, nopie := range []string{"-no-pie", "-nopie"} { if linkerFlagSupported(argv[0], nopie) {